前幾天對接公司內部其他部門的系統,用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.
然后,他將該契約包上傳到私服,我從私服下載,重新單元測試調用,成功!!!
雖說最后證明是一個簡簡單單的問題,但是中途也是很波折啊,記錄一下,權當學習了~ 純文字版本,有點難讀,但是總體就兩個點: 是否序列化了? 是否服務端與客戶端使用了相同版本的契約包?