SpringBoot工程下使用OpenFeign的坑及解決
一、前言
在SpringBoot工程(注意不是SpringCloud)下使OpenFeign的大坑。為什么不用SpringCloud中的Feign呢?
首先我的項目比較簡單(目前只有l(wèi)ogin與業(yè)務模塊)所以暫時不去引入分布式的架構,但兩個服務之間存在一些聯(lián)系因此需要接口調用接口(實現(xiàn)該操作方式很多我選擇了OpenFeign,踩坑之路從此開始。。。)。
二、具體的坑
使用OpenFeign我是直接參考官方的demo,官方的例子寫的簡潔明了直接套用到自己的工程中即可,自己也可以做相應的封裝再調用但demo中使用到了一個feign的核心注解@RequestLine,問題就是出在該注解上。
此時你去做調試如果使用的是GET請求,被請求的接口則會收到POST的請求然后A接口(請求方)就報500的錯誤,B接口(被請求方)則提示接口不支持POST請求(不支持POST請求是非常正常的,因為B接口定義的method是GET方法)。
以下是我的代碼片段:
自定義UserFeign接口
public interface UserFeign { /** * 根據userId獲取用戶信息 * @param userId * @return */ @RequestLine("GET /user/getUserById?id={id}") Result getUserById(@Param("id") String userId); }
調用UserFeign接口
@Service public class UserService{ /** * 通過OpenFegin實現(xiàn)接口調用接口 * @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接口 (請求方)
@RequestMapping(value = "/test", method = RequestMethod.GET) public Result test() { String id = "ad545461300a"; return userService.getUserByIdWith(id); }
B接口 (被請求方)
@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); }
以上代碼我做了一些小調整,將調用UesrFeign接口中的方法封裝在UserService中并且使用了@service這樣我就可以在其它地方直接注入UserService然后調用其中方法。
你會覺得以上代碼跟官網的demo沒啥區(qū)別但官方文檔中并沒有說明使用@RequestLine注解需要進行配置(事實上需要進行配置的)。
配置代碼如下:
@Bean public Contract useFeignAnnotations() { return new Contract.Default(); }
完成以上的配置就可以進行正常的調用了,該問題困擾我好幾天了今天終于解決了(真不容易),希望該文章沒有白寫。
最后感謝這篇文章讓我在放棄的時候找到了思路。(調試中遇到的細節(jié)問題就不在此進行贅述了)
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
解決JAVA8 Collectors.toMap value為null報錯的問題
這篇文章主要介紹了解決JAVA8 Collectors.toMap value為null報錯的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01PrintStream和PrintWriter的區(qū)別簡介
這篇文章主要介紹了PrintStream和PrintWriter的區(qū)別簡介,具有一定借鑒價值,需要的朋友可以參考下2018-01-01