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

时间:2013-09-09 14:36:52

标签: 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

遗憾的是,日志没有显示发生序列化问题的行或类,但调试ESB直到发生问题的步骤,所有使用的HashMap都只有Seri​​alizable对象,如String,Long和Date!< / p>

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

你以前见过这样的事吗?

1 个答案:

答案 0 :(得分:24)

发现了问题!

远程服务试图抛出一个封装来自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 (as you can see here)的内部类,它是Collection的一个实现,不是Serializable。因此,抛出内容为HashMap.values()的异常,远程方法将抛出序列化异常!

例如, ArrayList是Serializable,可用于解决此问题。工作代码:

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