一、问题:
通过telnet命令,去调⽤使用了dubbo框架的查询订单接口,一直调用出错, 查询后台⽇志,发现uAccount字段没有传递过去,为null。
二、产生问题的原因猜测:
- uAccount可能类似class字段,在dubbo中特殊处理了。
- 反序列化时出现了问题,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)转换为二进制,此方式转化时不会出现以上问题。
四、总结
- 在使用telnet调用dubbo接口,一定要注意参数命名的问题
- get/set后面紧跟的的字母不一定是大写。
网友评论