java.io.NotSerializableException:java.util.HashMap$值

java.io.NotSerializableException:java.util.HashMap$值,java,serialization,map,hashmap,esb,Java,Serialization,Map,Hashmap,Esb,堆栈跟踪: org.jboss.remoting.InvocationFailureException: Unable to perform invocation; nested exception is: java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: java.util.HashMap$Values 遗憾的是,日志中没有显示出现序列化问题的行或类,而是在出现问题的步骤之前调试

堆栈跟踪:

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等可序列化对象

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

您以前见过类似的情况吗?

发现了问题

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


HashMap有一个名为的内部类,它是集合的实现,不可序列化。因此,如果抛出内容为
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

+1由于源是一个映射,也许您可以允许
e.setValues(IdentifierMap)因为映射应该是可序列化的。@PeterLawrey也是一个很好的解决方案,Peter,一如既往。但是我不想更改
setValues
方法的签名,因为它在其他地方正以这种方式使用和处理。谢谢你的贡献。我也有同样的问题,但是关于键集,谢谢你的提示!
return new ArrayList(hashMap.values()); // problem solved