基於FeignException$InternalServerError的解決方案
原因:
feign傳值出錯無法接收到傳值
由於是POST所以添加@RequestBody進行嘗試
解決:
錯誤原因是未添加@RequestBody
嘗試不通過json直接在body中傳字符串看看能不能直接通過@RequestBody接收
Feign調用時失敗,feign.FeignException:status 500 readingXXX。LocalDate序列化引起的錯誤
最近在項目中需要用feign做一個服務端調用,調用別的服務的接口將我的一些信息發給它,但是總是
報錯:feign.FeignException:status 500 readingXXX。
我的調用代碼如下:
@PostMapping(value = "/xx/xxx") public ResultData<String> saveProjectInfo(ProjectInfo p);
按理說應該是沒問題的,對方也返回瞭code為500的響應,說明請求確實送達瞭對方接口,但是沒有正常處理。
於是懷疑是參數沒有傳對,然後就打斷點調試,把發送請求前的參數信息“p”復制出來,打開對方項目的swagger文檔,發送復制來的參數,發現能正常調通。
這就奇怪瞭,同樣的參數在我這裡通過feign調用就不行,在swagger上直接調用就可以。於是開始到處找原因,最後在別人的建議下用抓包工具抓從我調用方法這裡發出的請求包,看看從我這裡發出的包是否任然與swagger上輸的參數一樣。
果然發現瞭問題,因為對方的ProjectInfo類的crateTime屬性是LocalDate類型的,為瞭類型一致我這裡建實體類時也把createTime屬性設為LocalDate類型的。
在swagger上測試直接輸字符串就行,對方的接口在接收參數時直接就將其轉為LocalDate瞭:
{ ....... "createTime" : "2020-01-09" ......... }
但是我的請求發出後,抓的包顯示createTime變成瞭這樣:
這就導致與對方的接收參數不一致,自然就直接報錯瞭。最後直接把我的ProjectInfo實體類的createTime屬性設為String類型即可,也可以引入jar包後使用一些註解在發送時將這個屬性序列化成指定的格式如”yyyy-MM-dd“
總之就是對於LocalDate這個類,默認轉化為json時將它看成瞭一個普通的JavaObject(我預期轉化成yyyy-MM-dd),然後發送到網絡上。而在對方接收時卻不能根據那種格式json正確的轉換成LocalDate類型的對象,於是就報錯。
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- feign post參數對象不加@RequestBody的使用說明
- 使用Feign消費服務時POST/GET請求方式詳解
- PHP使用Swagger生成好看的API文檔
- 解決SpringCloud Feign傳對象參數調用失敗的問題
- springboot前端傳參date類型後臺處理的方式