故事背景
有個朋友在微信上問我,說 Feign 調用的時候服務提供方有結果,但是在調用方這邊這個字段的值卻丟失了,我一聽感覺不可思議,如果說全部的值都沒有,那有可能是報錯了之類的情況。
但是某一個字段的值不見了,這種情況還真沒遇到過。下圖就是調用方的獲取的信息,nickname 值丟了。
Feign 內部排查數據是否取到
如果服務提供方有值並且返回了,那麼唯一的問題就是出在 Feign 的內部了,懷疑跟內部解碼有關係,只能調試代碼纔可以找出問題。
在 org.springframework.cloud.openfeign.support.SpringDecoder 類中的 decode 方法裏查看數據解碼之後到底有沒有丟失,發現確實已經不存在了。
既然解碼後就不在了,那麼解碼之前呢?
通過下面的代碼看看解碼之前的數據到底有沒有丟失:
IoUtils.toString(new FeignResponseAdapter(response).getBody(), "utf-8")
到這裏基本上這個問題的原因就找到了,從服務端獲取的數據肯定沒問題,我們也看到確實是存在的,然後一解碼就沒了。
解碼排查
但是解碼也沒什麼特別的呀,就是用 HttpMessageConverter 進行數據轉換。最底層就是 ObjectMapper 將字符串轉成對象而已,只能看看 Json 轉換哪裏有沒有問題。
最後在 com.fasterxml.jackson.databind.deser.BeanDeserializer#deserializeFromObject 找到了問題,nickname 這個字段找不到,估計是被忽略了。
然後打開對應的實體類,發現字段上面加了 @JsonIgnore 我的天。。。如果一開始就去看看接收的實體類那麼直接就能發現這個問題了,剛開始也沒想到會是這樣,不過從框架的源碼中去一步步發現問題會更有意思,也符合一步步排坑的邏輯。
關於作者:尹吉歡,簡單的技術愛好者,《Spring Cloud 微服務-全棧技術與案例解析》, 《Spring Cloud 微服務 入門 實戰與進階》作者, 公衆號 猿天地 發起人。個人微信 jihuan900, 歡迎勾搭。
相關推薦
後臺回覆 學習資料 領取學習視頻
如有收穫,點個在看,誠摯感謝