1. 程式人生 > 其它 >SpringCloud 使用Feign遠端呼叫時,序列化物件失敗

SpringCloud 使用Feign遠端呼叫時,序列化物件失敗

技術標籤:微服務java基礎javaspringspring boot

使用Feign遠端呼叫時,序列化物件失敗

最近在搭建一個SpringCloud的微服務時,遇到了一個問題,在使用Feign遠端呼叫時報錯,返回物件沒有無參構造方法,有其他的含引數的構造方法。本地自己搭建的微服務目錄大概如下,才剛開始,後續會逐漸補充優化迭代,有興趣的可以fork下地址:https://github.com/zhanghailang123/MyCloud 給與指導意見。

  • Eureka :註冊中心服務端,採用Eureka註冊中心
  • EurekaClientA :其中的一個Eureka服務端,命名有點隨意,相當於一個數據提供中心,暫時沒有使用ORM框架對接資料庫,把相應資料寫死了,目前只是在練習使用為了方便,後續考慮使用SpringJPA,因為Mb用的太多了
  • FeignZ :feign模組遠端呼叫加負載均衡,而且整合了Hystrix熔斷機制,當然目前只做了最簡單的Demo,練習下手感[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-zrYl5OL6-1610637781698)(使用Feign遠端呼叫時,序列化物件失敗.assets/0093883F.png)]。
  • HystrixDashboard :Hystrix儀表盤,可以關注下當前的伺服器狀況[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-eWA1yMRg-1610637781700)(使用Feign遠端呼叫時,序列化物件失敗.assets/clipboard.png)]
  • RibbonZ :主要用作於負載均衡,啟動時可以啟動EurekaClientA 多次指定不同的埠號,來測試下負載均衡,一般都是用Feign直接遠端呼叫,內建了ribbon,這個demo中也是為了測試用的。
  • TurBineZ :用來監控叢集的熔斷情況。
  • ZuulZ :閘道器

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-v5lgEvRs-1610637781702)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210114224349531.png)]

接下來進入正題。

場景: 在使用Feign遠端呼叫寫死的資料服務EurekaClientA時,報錯如下

feign模組如下:[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-5ZjHsM64-1610637781704)(使用Feign遠端呼叫時,序列化物件失敗.assets/image-20210114224520211.png)]

此處為了復現問題,將熔斷邏輯暫時註釋掉

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-Xp41zodv-1610637781706)(使用Feign遠端呼叫時,序列化物件失敗.assets/image-20210114230234495.png)]

此處報錯資訊:

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `org.example.pojo.Student` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)

報錯的物件 :org.example.pojo.Student 如下,一個很簡單的bean物件:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-VNXMG8so-1610637781708)(使用Feign遠端呼叫時,序列化物件失敗.assets/image-20210114230523431.png)]

那為什麼會報這個問題呢 :不存在無參建構函式,序列化失敗

帶著疑問走進報錯的地方

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-jTDtBeOe-1610637781709)(使用Feign遠端呼叫時,序列化物件失敗.assets/image-20210114230730277.png)]

可以看到是這個地方 canInstantiate()方法校驗沒通過。在此處打個斷點一探究竟

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-YvDvqBk7-1610637781709)(使用Feign遠端呼叫時,序列化物件失敗.assets/image-20210114231044082.png)]

這個校驗裡面內容是:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-BOAw0Ds5-1610637781710)(使用Feign遠端呼叫時,序列化物件失敗.assets/image-20210114231159718.png)]

總之都是校驗無參建構函式。如果給呼叫的student物件加上無參建構函式就可以成功呼叫。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-tuOtG5Ic-1610637781711)(使用Feign遠端呼叫時,序列化物件失敗.assets/image-20210114231909848.png)]

問題倒不是什麼大問題,在搭建服務過程中,只有親力親為,切實參與到了,才能感受到各種奇奇怪怪的小問題,也只有這樣自己親自動手,才是收穫最大的。