升级Dubbo3.2.6遇到的一个异常反序列化问题

还是使用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

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值