天天看點

dubbo rpc調用,接收到的bean為null原因?

  前幾天對接公司内部其他部門的系統,用dubbo調用,dubbo看起來很簡單,但是卻讓我們調試了好久啊!

  下面是調試紀錄:

1. 調用該服務時,直接調不通,檢視錯誤為 no provider ?

  然後就去檢視該部門的服務是不是部署了最新的代碼,并重新打包部署。

  結果還是不行。然後去檢視代碼,發現暴露該接口的配置部分,由于某種原因,被注釋掉了,哎呀,我去。

  将暴露該接口的配置打開,重新部署,總算可以在dubbo背景看到該服務了。

2. 再次調用該接口,結果報錯,不能進行序列化,即提示: no implements Serializable ?

  最後,終于确認,該段代碼是不可用的,未繼承 Serializable 的接口是不能被調用的。

  然後找相應同僚改掉該代碼,繼承 Serializable 接口,總算可以調通了。

3. 報某字段資料類型非法 Date, java.lang.IllegalAgumentException ?

  java.sql.Date.getMinutes(Date.java: 194) 

  最後發現,是該類型将會導緻實作端報錯,然後該同僚再改代碼。

4. 我再次調用,然後不報錯了,但是我發現我的所有結果都沒有了,全部傳回null.

  然後,該同僚自己寫了單元測試用例,調用以後,證明該問題在他那裡是不存在的。然後我蒙逼了。

5. 我也寫單元測試,直接調用他本地代碼,進行斷點調試,結果還是不行?

  弄了好久,實在幹不動,就去請教高手指導一下。

  确認一下之後,說是沒有序列化,可能導緻兩邊無法認為該bean是同一個執行個體;

  沒有使用相同的調用協定,結果證明是相同協定;高手也無解了。

6. 最後,該同僚自己解決了該問題,原因為他将之前報錯的類型改掉了,但是我作為用戶端調用卻沒有同步更改,進而導緻序列化結果不一緻,進而解析為null.

  然後,他将該契約包上傳到私服,我從私服下載下傳,重新單元測試調用,成功!!!

  雖說最後證明是一個簡簡單單的問題,但是中途也是很波折啊,記錄一下,權當學習了~  純文字版本,有點難讀,但是總體就兩個點: 是否序列化了? 是否服務端與用戶端使用了相同版本的契約包?

不要害怕今日的苦,你要相信明天,更苦!