[apache/dubbo]自2.7.5版本后 dubbo泛化实现存在问题不能正常反序列化的情形

2024-06-24 316 views
1
  • Dubbo version: 2.7.18
  • Operating System version: macos
  • Java version: 1.8
  1. 服务端采用dubbo泛化实现方式,服务端直接返回map类型的响应对象,响应对象中有list集合,list中返回的数据为map结构
  2. 客户端正常调用,收到的响应数据list中的map结构没有转换为接口定义的实际java对象,导致程序做进一步处理报错
  3. 经验证3.1.1 版本仍然存在该问题
  4. 经排查后出问题的类为DecodeableRpcResult,代码段如下: image image

Pls. provide [GitHub address] to reproduce this issue. https://github.com/iloveoovo/dubbo-genericimpl-issue

consumer端能正常反序列化

consumer 端对于响应参数字段中List 字段的泛型处理错误

回答

4

泛化掉用实际反序列化是在 org.apache.dubbo.rpc.filter.GenericFilter 中进行的。需要看服务端返回的格式是怎么样的,以及对应类是否真的存在。

5

是泛化实现不正确,如下图所示:标志1是接口定义,标注2是实际返回的数据

image

针对泛化实现这个场景, 由于DecodeableRpcResult 没有进入图1中的位置,导致后续通过PojoUtils进行map转bean的分支进入不了:

image image image
8

2.7.4.1以前都能正常处理的

5

可以提供一个 Demo 吗,泛化实现和 dubbo 协议本身是解耦的,如果有行为差异应该还是在别的地方。

6

问题已定位,是在 GenericImplFilter 中重建 Invocation 时 returnType 没有覆盖,导致 hessian 尝试通过对应类提前反序列化