spring cloud feign不支持@RequestBody+ RequestMethod.GET報(bào)錯(cuò)的解決方法
1.問(wèn)題梳理:
異常:org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'POST' not supported
很明顯是最終feign執(zhí)行http請(qǐng)求時(shí)把這個(gè)方法認(rèn)定為POST,但feign client中又定義了RequestMethod.GET 或 @GetMapping,沖突導(dǎo)致報(bào)錯(cuò)
那么為什么feign會(huì)認(rèn)為這個(gè)方法是post呢?
源碼追蹤:
1.我們從feignClient注解作為入口來(lái)看:

2.按照spring cloud一貫風(fēng)格,我們打開(kāi)FeignAutoConfiguration這個(gè)類(lèi)看配置邏輯:

看上圖紅框內(nèi)的標(biāo)注:這個(gè)類(lèi)在不存在ILoadBalancer時(shí)才觸發(fā),我們項(xiàng)目開(kāi)啟了Ribbon,所以肯定存在,再看注釋?zhuān)狠d入負(fù)載均衡ribbon clients需要走FeignRibbonClientAutoConfiguration這個(gè)類(lèi)配置。go~

如上圖,看紅框注釋?zhuān)喊凑諏?dǎo)入從上往下的順序:HttpClientFeignLoadBalancedConfiguration>OkHttpFeignLoadBalancedConfiguration>DefaultFeignLoadBalancedConfiguration,對(duì)應(yīng)的底層http工具:httpclient>okhttp>HttpURLConnection
根據(jù)http協(xié)議定義是支持@RequestBody+ RequestMethod.GET的,那么具體就得看工具包實(shí)現(xiàn)的不同的,查看源碼發(fā)現(xiàn)okhttp和HttpURLConnection都不支持(報(bào)錯(cuò)),只有httpclient支持。(默認(rèn)走HttpURLConnection會(huì)報(bào)錯(cuò))
我們知道只有httpclient支持@RequestBody+ RequestMethod.GET,所以我們必須滿足條件走HttpClientFeignLoadBalancedConfiguration才行,看下源碼:

可見(jiàn),滿足類(lèi)路徑下存在ApacheHttpClient類(lèi)即可。我們?cè)賞om中添加:
<dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-httpclient</artifactId> </dependency>
最終載入了feign-httpclient-9.5.0.jar包,打開(kāi)看里面就一個(gè)ApacheHttpClient.class,點(diǎn)進(jìn)去看其實(shí)就是一個(gè)httpclient。

所以pom中引入feign-httpclient--》類(lèi)路徑下存在ApacheHttpClient.class--》走HttpClientFeignLoadBalancedConfiguration--》請(qǐng)求時(shí)走HttpClient--》支持@RequestBody+ RequestMethod.GET
2.解決方式:
pom中引入
<dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-httpclient</artifactId> </dependency>
maven更新后查看項(xiàng)目中是否存在了feign-httpclient-9.5.0.jar包。
總結(jié)
以上所述是小編給大家介紹的spring cloud feign不支持@RequestBody+ RequestMethod.GET報(bào)錯(cuò)的解決方法,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
使用Spring的注解方式實(shí)現(xiàn)AOP實(shí)例
本篇文章主要介紹了使用Spring的注解方式實(shí)現(xiàn)AOP實(shí)例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06
SpringBoot如何IDEA中實(shí)現(xiàn)熱部署
這篇文章主要介紹了SpringBoot如何IDEA中實(shí)現(xiàn)熱部署,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
Java調(diào)用C++程序的實(shí)現(xiàn)方式
這篇文章主要介紹了Java調(diào)用C++程序的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
java中JSONObject轉(zhuǎn)換為HashMap(方法+main方法調(diào)用實(shí)例)
這篇文章主要介紹了java中JSONObject轉(zhuǎn)換為HashMap(方法+main方法調(diào)用實(shí)例),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
Mybatis?selectKey 如何返回新增用戶的id值
這篇文章主要介紹了Mybatis?selectKey 如何返回新增用戶的id值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
java開(kāi)發(fā)AOP面向切面編程入門(mén)
這篇文章主要介紹了java開(kāi)發(fā)的AOP面向切面編程入門(mén)的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步學(xué)有所得2021-10-10
深入分析:用1K內(nèi)存實(shí)現(xiàn)高效I/O的RandomAccessFile類(lèi)的詳解
本篇文章是對(duì)用1K內(nèi)存實(shí)現(xiàn)高效I/O的RandomAccessFile類(lèi)的詳細(xì)分析介紹,需要的朋友參考下2013-05-05
SpringCloud?GateWay網(wǎng)關(guān)示例代碼詳解
這篇文章主要介紹了SpringCloud?GateWay網(wǎng)關(guān),Spring?cloud?Gateway的功能很多很強(qiáng)大,文中提到了Spring?Cloud?Gateway中幾個(gè)重要的概念,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2022-04-04

