telnet调用Dubbo接口的坑

2019-09-18  本文已影响0人  雨夏_

一、问题:

通过telnet命令,去调⽤使用了dubbo框架的查询订单接口,一直调用出错, 查询后台⽇志,发现uAccount字段没有传递过去,为null。

二、产生问题的原因猜测:

  1. uAccount可能类似class字段,在dubbo中特殊处理了。
  2. 反序列化时出现了问题,uAccount这种小写开头,紧跟着的⼀个是⼤写字母的 字段生成的get/set⽅方法,get/set后面紧跟着的字母是小写。例例setuAccount。

三、源码追踪分析:

InvokeTelnetHandler.java

通过telnet命令调用的dubbo接口,会在InvokeTelnetHandler将json字符串转换为对应的请求参数对象,在95行中,通过PojoUtils.realize()方法进行转换。


PojoUtils.realize()

在PojoUtils中,主要是通过realize0这个方法进行反序列化,在438和439来获取属性的set方法或者直接获取这个属性,然后在下面调用反射调用set方法或者直接通过反射赋值。

问题产生的关键点:

getSetterMethod()

获取set方法的时候,把set紧跟的这个字符转换成了大写,也就是setUAccount,咱们通过idea自动生成get/set方法,像这种类型(小写开头,紧跟大写字母)产生的get/set后面紧跟的第一个字母都是小写字母,所以就获取不到set方法了。


getField()

getField方法中,由于咱们设置的属性一般都private属性的,所有这里通过class.getField()和class.getFields()都获取不到。

为什么通过dubbo调用时不会出现该问题?

通过dubbo接口调用时,会通过序列化组件将请求对象通过指定的协议(默认hessian2)转换为二进制,此方式转化时不会出现以上问题。

四、总结

上一篇下一篇

猜你喜欢

热点阅读