納尼,Spring Cloud Feign 數據竟然丟失了

故事背景

有個朋友在微信上問我,說 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, 歡迎勾搭。

相關推薦

後臺回覆 學習資料 領取學習視頻

如有收穫,點個在看,誠摯感謝

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章