小小涉及OpenFeign原理:Could not extract response: no suitable HttpMessageConverter found for response type
一、問題解釋(想看總結的去最下面)
org.springframework.web.client.UnknownContentTypeException: Could not extract response: no suitable HttpMessageConverter found for response type [class XXX] and content type [XXX;XXX]凡是報這個錯誤,翻譯成人話就是
沒有一個自帶的轉換器能把[class XXX]轉換成content type [XXX;XXX]
二、問題解決
例如我這個項目,技術棧是nacos+openfeign+springboot+springcloud
我是在feign遠程調用那會報錯的。
情形一:
以 content type[text/html;charset=utf-8] 為例子
可以自行建立一個config包,在config包下寫下MyRestTemplate類即可:
情形二:(有說到feign原理,懇請大家認真理解謝謝)
說在最前面!!!!!!!!!!!!
也許看完之后你發現你的問題和我的表面上完全不一樣,但是我說的是思路,還是希望能幫到各位,可以自己去debug再試試哦,莫慌莫慌
開始:結合我個人經歷去看,我debug了很久發現了一些問題
1.首先我有一個過濾器,過濾器會幫我過濾掉那些沒登錄就想請求私密領域的請求
2.其次我debug了一下feign源碼,我發現feign自動幫我用RequestTemplate這個類來幫我重新構造一個請求
換句話說,但凡調用遠程方法,feign都會“沒事干”地重新搞出一個新請求
3.然后我debug把遠程調用的報錯那塊try catch得到了標題這個報錯
4.這個時候別急,先去瀏覽器自己把完整url寫好,在瀏覽器自己調用一下報錯的那個遠程方法,這個時候我的攔截器出場了,如下圖:
語句1,我注釋了,但是沒測試過注釋了行不行
語句2,我直接去訪問那個頁面的時候跳了這個報告,報告這個東西的原因是我的攔截器把這個請求攔截了,因為沒登錄
我現在大概知道為什么了
解釋:
在遠程調用方法的時候,feign是會重構造請求的,而feign重構造請求會丟失請求頭和丟失上下文(這個可以百度,相當于常識),換句話說,就算你登錄了,遠程調用的時候由于丟失了session,系統也會判斷你沒登錄。
于是!
注意!!!!!!!!!!
原本被調用的那個方法應該給我返回一個[application/json]這種類型的數據
但是你可能因為沒登錄,也就是沒調到那個接口,他給你重定向去了首頁,返回的類型不是[application/json],而有可能是下圖這種奇怪類型
恰好feign又沒有辦法解析這種類型,于是報錯!!
我想我應該說明白了吧…是吧?(笑)
我解決問題比較暴力,如下圖:
當匹配到這個路徑(也就是報錯的那個服務的url路徑)的時候,我直接返回true,也就是默認他已經登錄,然后再啟動服務,發現這次就沒報錯了。
總結
檢查 content type [XXX;XXX] 到底是不是你要的,比如你希望得到 content type [application/json] 但是實際上卻不是。
如果不是你想要的,你就得看看你的其他遠程服務會不會報同樣的錯,如果沒有報錯,說明是個別問題,需要你詳細看上面的情形二,找找靈感。如果是普適錯誤,說明你可能有其他問題…
如果是你想要的,那我覺得你去看看情形一吧,看看加上這個類有沒有用…
總結
以上是生活随笔為你收集整理的小小涉及OpenFeign原理:Could not extract response: no suitable HttpMessageConverter found for response type的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 得意的动物是什么生肖(得意的动物是什么生
- 下一篇: vr手机怎么看(手机如何看VR)