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