基於FeignException$InternalServerError的解決方案
原因:
feign傳值出錯無法接收到傳值
由於是POST所以新增@RequestBody進行嘗試
解決:
錯誤原因是未新增@RequestBody
嘗試不通過on直接在body中傳字串看看能不能直接通過http://www.cppcns.com@RequestBody接收
Feign呼叫時失敗,feign.FeignException:status 500 readingXXX。LocalDate序列化引起的錯誤
最近在專案中需要用feign做一個服www.cppcns.com務端www.cppcns.com呼叫,呼叫別的服務的介面將我的一些資訊發給它,但是總是
報錯:feign.FeignException:status 500 readingXXX。
我的呼叫程式碼如下:
@PostMappinUgdEbkdyKqg(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包後使用一些註解在傳送時將這個屬性序列化成指定的格式UgdEbkdyKq
總之就是對於LocalDate這個類,預設轉化為json時將它看成了一個普通的Object(我預期轉化成yyyy-MM-dd),然後傳送到網路上。而在對方接收時卻不能根據那種格式json正確的轉換成LocalDate型別的物件,於是就報錯。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援我們。