SpringBoot工程下使用OpenFeign的坑及解決
一、前言
在SpringBoot工程(注意不是SpringCloud)下使OpenFeign的大坑。為什么不用SpringCloud中的Feign呢?
首先我的項(xiàng)目比較簡(jiǎn)單(目前只有l(wèi)ogin與業(yè)務(wù)模塊)所以暫時(shí)不去引入分布式的架構(gòu),但兩個(gè)服務(wù)之間存在一些聯(lián)系因此需要接口調(diào)用接口(實(shí)現(xiàn)該操作方式很多我選擇了OpenFeign,踩坑之路從此開(kāi)始。。。)。
二、具體的坑
使用OpenFeign我是直接參考官方的demo,官方的例子寫的簡(jiǎn)潔明了直接套用到自己的工程中即可,自己也可以做相應(yīng)的封裝再調(diào)用但demo中使用到了一個(gè)feign的核心注解@RequestLine,問(wèn)題就是出在該注解上。
此時(shí)你去做調(diào)試如果使用的是GET請(qǐng)求,被請(qǐng)求的接口則會(huì)收到POST的請(qǐng)求然后A接口(請(qǐng)求方)就報(bào)500的錯(cuò)誤,B接口(被請(qǐng)求方)則提示接口不支持POST請(qǐng)求(不支持POST請(qǐng)求是非常正常的,因?yàn)锽接口定義的method是GET方法)。
以下是我的代碼片段:
自定義UserFeign接口
public interface UserFeign {
/**
* 根據(jù)userId獲取用戶信息
* @param userId
* @return
*/
@RequestLine("GET /user/getUserById?id={id}")
Result getUserById(@Param("id") String userId);
}
調(diào)用UserFeign接口
@Service
public class UserService{
/**
* 通過(guò)OpenFegin實(shí)現(xiàn)接口調(diào)用接口
* @param userId
* @return
*/
public Result getUserByIdWith(String userId) {
UserFeign userInfo = Feign.builder()
.decoder(new JacksonDecoder())
.target(UserFeign.class, "http://localhost:8080");
Result res = userInfo.getUserById(userId);
return res;
}
}
A接口 (請(qǐng)求方)
@RequestMapping(value = "/test", method = RequestMethod.GET)
public Result test() {
String id = "ad545461300a";
return userService.getUserByIdWith(id);
}
B接口 (被請(qǐng)求方)
@RequestMapping(value = "/getUserById", method = RequestMethod.GET)
public Result getUserByUserId(@RequestParam(required = true) String id){
if ("".equals(id)) {
throw new BusinessException(400, "userId不能為空!");
}
Users info = usersService.getUserById(id);
if (info == null) {
throw new BusinessException(404, "userId有誤!");
}
return ResultUntil.success(info);
}
以上代碼我做了一些小調(diào)整,將調(diào)用UesrFeign接口中的方法封裝在UserService中并且使用了@service這樣我就可以在其它地方直接注入U(xiǎn)serService然后調(diào)用其中方法。
你會(huì)覺(jué)得以上代碼跟官網(wǎng)的demo沒(méi)啥區(qū)別但官方文檔中并沒(méi)有說(shuō)明使用@RequestLine注解需要進(jìn)行配置(事實(shí)上需要進(jìn)行配置的)。
配置代碼如下:
@Bean
public Contract useFeignAnnotations() {
return new Contract.Default();
}
完成以上的配置就可以進(jìn)行正常的調(diào)用了,該問(wèn)題困擾我好幾天了今天終于解決了(真不容易),希望該文章沒(méi)有白寫。
最后感謝這篇文章讓我在放棄的時(shí)候找到了思路。(調(diào)試中遇到的細(xì)節(jié)問(wèn)題就不在此進(jìn)行贅述了)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java使用正則表達(dá)式截取重復(fù)出現(xiàn)的XML字符串功能示例
這篇文章主要介紹了Java使用正則表達(dá)式截取重復(fù)出現(xiàn)的XML字符串功能,涉及java針對(duì)xml字符串及指定格式字符串的正則匹配相關(guān)操作技巧,需要的朋友可以參考下2017-08-08
Spring Boot快速實(shí)現(xiàn) IP地址解析的示例詳解
這篇文章主要介紹了Spring Boot快速實(shí)現(xiàn)IP地址解析,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08
RestTemplate 401 獲取錯(cuò)誤信息的處理方案
這篇文章主要介紹了RestTemplate 401 獲取錯(cuò)誤信息的處理方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
Java中的BaseTypeHandler自定義類型轉(zhuǎn)換器的使用
這篇文章主要介紹了Java中的BaseTypeHandler自定義類型轉(zhuǎn)換器的使用,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-05-05
Java 如何使用JDBC連接數(shù)據(jù)庫(kù)
這篇文章主要介紹了Java 如何使用JDBC連接數(shù)據(jù)庫(kù),幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下2021-02-02
淺談Spring中幾個(gè)PostProcessor的區(qū)別與聯(lián)系
這篇文章主要介紹了淺談Spring中幾個(gè)PostProcessor的區(qū)別與聯(lián)系,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
SpringBoot配置@Configuration注解和@bean注解
這篇文章主要介紹了SpringBoot配置@Configuration注解和@bean注解,文章圍繞主題相關(guān)內(nèi)容展開(kāi)詳細(xì)介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-04-04

