简记:com.alibaba.dubbo.remoting.RemotingException: Fail to decode request due to: RpcInvocation

来源:互联网 发布:js向html传值 编辑:程序博客网 时间:2024/06/05 09:01


原因:

1.传输的参数中是否包含了不能序列化的属性,例如ImmutableList、Joda DateTime等。


解决办法:

1.传输的参数中去除不能序列化的属性,使用可序列化参数代替。


原因分析


dubbo中默认使用的是hessian的序列化,当使用spring-data-commons的pageable时,会在反序列化时出错,出错原因是由于hessian会先生成一个参数为0的类,再去设置类的值,然而,AbstractPageRequest中的构造函数对参数进行了限制,参数小于1的时候直接thrown异常,所以导致反序列化出错。这就是原因。所以要么自己定义。要么自己定义。

具体在这个函数里com.alibaba.com.caucho.hessian.io.JavaDeserializer.instantiate()。其它信息自己跟踪吧。

这个问题比较坑的一点就是dubbo会在处理失败后,设置com.alibaba.dubbo.remoting.exchange.Request对象中的mBroken为true,然后在com.alibaba.dubbo.remoting.exchange.support.header.HeaderExchangeHandler的handleRequest方法中进行判断,把错误信息吃掉了,从而变成了Fail to decode request due to:,所以很难查出问题原因。

源码:https://github.com/obiteaaron/fix-spring-data-common-deserialize

—————-分割线 2016-09-05 更新—————-
最近在做另一个项目时发现 hessian 和 hessian2 都可以不需要类实现 serializable 实现序裂化和反序列化。在查看源码时发现,hessian 使用的是 UnsafeDeserializer 这个类,而这个类在最新的版本(2.5.3)的 dubbo 里面并不存在,它默认只会返回 Javadeserializer ,从而导致上面反序列化报错的问题(可能是代码精简,也可能是其它原因)。dubbo项目已死,所以各位自行开发扩展吧,或者使用其它公司维护的版本,如 dubbox,github 上有源码。

https://github.com/alibaba/dubbo
https://github.com/dangdangdotcom/dubbox      





阅读全文
0 0
原创粉丝点击