一、問(wèn)題:
通過(guò)telnet命令,去調(diào)?使用了dubbo框架的查詢訂單接口,一直調(diào)用出錯(cuò), 查詢后臺(tái)?志,發(fā)現(xiàn)uAccount字段沒(méi)有傳遞過(guò)去,為null。
二、產(chǎn)生問(wèn)題的原因猜測(cè):
- uAccount可能類似class字段,在dubbo中特殊處理了。
- 反序列化時(shí)出現(xiàn)了問(wèn)題,uAccount這種小寫(xiě)開(kāi)頭,緊跟著的?個(gè)是?寫(xiě)字母的 字段生成的get/set?方法,get/set后面緊跟著的字母是小寫(xiě)。例例setuAccount。
三、源碼追蹤分析:

通過(guò)telnet命令調(diào)用的dubbo接口,會(huì)在InvokeTelnetHandler將json字符串轉(zhuǎn)換為對(duì)應(yīng)的請(qǐng)求參數(shù)對(duì)象,在95行中,通過(guò)PojoUtils.realize()方法進(jìn)行轉(zhuǎn)換。

在PojoUtils中,主要是通過(guò)realize0這個(gè)方法進(jìn)行反序列化,在438和439來(lái)獲取屬性的set方法或者直接獲取這個(gè)屬性,然后在下面調(diào)用反射調(diào)用set方法或者直接通過(guò)反射賦值。
問(wèn)題產(chǎn)生的關(guān)鍵點(diǎn):

獲取set方法的時(shí)候,把set緊跟的這個(gè)字符轉(zhuǎn)換成了大寫(xiě),也就是setUAccount,咱們通過(guò)idea自動(dòng)生成get/set方法,像這種類型(小寫(xiě)開(kāi)頭,緊跟大寫(xiě)字母)產(chǎn)生的get/set后面緊跟的第一個(gè)字母都是小寫(xiě)字母,所以就獲取不到set方法了。

getField方法中,由于咱們?cè)O(shè)置的屬性一般都private屬性的,所有這里通過(guò)class.getField()和class.getFields()都獲取不到。
為什么通過(guò)dubbo調(diào)用時(shí)不會(huì)出現(xiàn)該問(wèn)題?
通過(guò)dubbo接口調(diào)用時(shí),會(huì)通過(guò)序列化組件將請(qǐng)求對(duì)象通過(guò)指定的協(xié)議(默認(rèn)hessian2)轉(zhuǎn)換為二進(jìn)制,此方式轉(zhuǎn)化時(shí)不會(huì)出現(xiàn)以上問(wèn)題。
四、總結(jié)
- 在使用telnet調(diào)用dubbo接口,一定要注意參數(shù)命名的問(wèn)題
- get/set后面緊跟的的字母不一定是大寫(xiě)。