10

堆栈跟踪:

org.jboss.remoting.InvocationFailureException: Unable to perform invocation;
nested exception is: java.io.WriteAbortedException: writing aborted;
java.io.NotSerializableException: java.util.HashMap$Values

遗憾的是,日志没有显示出现序列化问题的行或类,但调试 ESB 直到出现问题的步骤所有使用的 HashMap 都只有可序列化的对象,如 String、Long 和 Date!

此外,调用无效的远程方法时也会出现问题。

你以前见过这样的事情吗?

4

1 回答 1

29

发现问题了!

远程服务试图抛出一个封装字符串集合的异常HashMap.values()

if (!identifiersMap.isEmpty()) {
    context.setRollbackOnly();

    BusinessException e = new BusinessException();
    e.setValues(identifiersMap.values()); // here is where the problem is
    throw e;
}

HashMap 有一个名为Values的内部类(如您在此处看到的),它是 Collection 的实现,并且不可序列化。所以,抛出一个内容为 的异常HashMap.values(),远程方法会抛出一个序列化异常!

例如,ArrayList 是可序列化的,可用于解决问题。工作代码:

if (!identifiersMap.isEmpty()) {
    context.setRollbackOnly();

    BusinessException e = new BusinessException();
    e.setValues(new ArrayList(apIdentifiersMap.values())); // problem fixed
    throw e;
}

我的情况是,远程方法是无效的,它正在抛出异常,但请注意:

如果远程服务返回 HashMap$Values 实例,也会发生这种情况,例如:

return hashMap.values(); // would also have serialization problems

再一次,解决方案是:

return new ArrayList(hashMap.values()); // problem solved
于 2013-09-09T14:36:52.123 回答