SOFA-RPC使用自定义类型数组参数报错:argument type mismatch
1 问题表现
客户端通过RPC Proxy调用远程服务,报错:argument type mismatch
。
服务接口定义如下:
interface CacheNotifier {
void invalid2(HugeType type, Id[] ids);
}
2 问题定位分析
定位过程:
- 定位客户端在发送数据之前是否有问题;
- 若客户端无问题,定位服务端接收到的数据是否有问题;
- 若服务端接收的数据无问题,定位服务端处理数据是否有问题;
1 定位客户端在发送数据之前是否有问题
经过断点调试,在传输层(BoltClientTransport.syncSend())发送请求时,请求内容如下:
从截图中可看出来,request对象中的methodArgs
是正常的,参数类型与接口方法中定义的完全匹配。
2 定位服务端接收到的数据是否有问题
在服务端执行请求方法之前(ProviderInvoker.invoke()),请求内容如下:
从截图中可看出来,request对象中的methodArgs
是不正常的,methodArgs[1]
参数类型是Object[]
,与接口方法中定义的Id[]
不匹配。
在服务端收到请求进行反序列化时(SofaRequestHessianSerializer.decodeObjectByTemplate()),请求方法的信息如下:
从classSig[1]
的值是class [Lcom.baidu.hugegraph.backend.id.Id;
可以看出来,接受到的请求数据中的参数签名与接口方法参数签名即Id[]
类型完全匹配。
问题梳理:既然服务端接收到的数据正确(即Id[]
),但是服务端调用业务方法的时候参数类型不匹配(即Object[]
),那么就是服务端处理请求的问题,猜测应该是反序列化的问题。
辅助复现内容:方法decodeObjectByTemplate()详细堆栈如下:
Thread [SOFA-SEV-BOLT-BIZ-8090-12-T1] (Suspended)
SofaRequestHessianSerializer.decodeObjectByTemplate(AbstractByteBuf, Map