美文网首页
telnet调用Dubbo接口的坑

telnet调用Dubbo接口的坑

作者: 雨夏_ | 来源:发表于2019-09-18 12:51 被阅读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)转换为二进制,此方式转化时不会出现以上问题。

    四、总结

    • 在使用telnet调用dubbo接口,一定要注意参数命名的问题
    • get/set后面紧跟的的字母不一定是大写。

    相关文章

      网友评论

          本文标题:telnet调用Dubbo接口的坑

          本文链接:https://www.haomeiwen.com/subject/zmxkuctx.html