还是使用hessian2作为序列化方式,升级后方法抛出异常时候没有正常捕捉,错误堆栈如下:
Caused by: org.apache.dubbo.remoting.RemotingException: java.io.IOException: Response data error, expect Throwable, but get class java.util.HashMap
java.io.IOException: Response data error, expect Throwable, but get class java.util.HashMap
at org.apache.dubbo.common.serialize.ObjectInput.readThrowable(ObjectInput.java:76)
at org.apache.dubbo.common.serialize.DefaultSerializationExceptionWrapper$ProxyObjectInput.readThrowable(DefaultSerializationExceptionWrapper.java:184)
at org.apache.dubbo.rpc.protocol.dubbo.DecodeableRpcResult.handleException(DecodeableRpcResult.java:182)
at org.apache.dubbo.rpc.protocol.dubbo.DecodeableRpcResult.decode(DecodeableRpcResult.java:114)
at org.apache.dubbo.rpc.protocol.dubbo.DecodeableRpcResult.decode(DecodeableRpcResult.java:149)
at org.apache.dubbo.remoting.transport.DecodeHandler.decode(DecodeHandler.java:62)
at org.apache.dubbo.remoting.transport.DecodeHandler.received(DecodeHandler.java:50)
at org.apache.dubbo.remoting.transport.dispatcher.ChannelEventRunnable.run(ChannelEventRunnable.java:62)
at org.apache.dubbo.common.threadpool.ThreadlessExecutor$RunnableWrapper.run(ThreadlessExecutor.java:152)
at org.apache.dubbo.common.threadpool.ThreadlessExecutor.waitAndDrain(ThreadlessExecutor.java:77)
... 170 common frames omitted
google和百度搜了半天,没发现和我一样的问题,有一篇类似的文章是早期版本的。
这部分项目代码在2.7.x版本是正常运行的。
跟踪了半天,首先发现,如果在dubbo接口上显示声明抛出的异常的话,可以正常运行代码。因为很多异常写成了RuntimeException,接口上没有显示声明。涉及到的代码也很多,没办法一个一个补了,只能跟踪源码查找原因。
跟踪源码发现,DecodeableRpcResult反序列化时,如果没有显示声明抛出异常的的话,反序列化的对象是个Hashmap,两种情况下入参的二进制流是一样的。
继续跟踪,发现反序列化时候使用的是sticky模式,至此差不多清楚了。升级后新版本dubbo反序列化采用严格模式,接口上未声明的以及未涉及到的类都不会正常序列化。
最后加上这个配置就解决了:
dubbo.application.serialize-check-status: WARN