SpringBoot工程下使用OpenFeign的坑及解决


Posted in Java/Android onJuly 02, 2021

一、前言

在SpringBoot工程(注意不是SpringCloud)下使OpenFeign的大坑。为什么不用SpringCloud中的Feign呢?

首先我的项目比较简单(目前只有login与业务模块)所以暂时不去引入分布式的架构,但两个服务之间存在一些联系因此需要接口调用接口(实现该操作方式很多我选择了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实现接口调用接口
      * @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没啥区别但官方文档中并没有说明使用@RequestLine注解需要进行配置(事实上需要进行配置的)。

配置代码如下:

@Bean
public Contract useFeignAnnotations() {
    return new Contract.Default();
}

完成以上的配置就可以进行正常的调用了,该问题困扰我好几天了今天终于解决了(真不容易),希望该文章没有白写。

最后感谢这篇文章让我在放弃的时候找到了思路。(调试中遇到的细节问题就不在此进行赘述了)

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Java/Android 相关文章推荐
详解Java实践之建造者模式
Jun 18 Java/Android
Java集成swagger文档组件
Jun 28 Java/Android
解决ObjectMapper.convertValue() 遇到的一些问题
Jun 30 Java/Android
logback如何自定义日志存储
Aug 30 Java/Android
深入解读Java三大集合之map list set的用法
Nov 11 Java/Android
聊聊SpringBoot自动装配的魔力
Nov 17 Java/Android
Mybatis是这样防止sql注入的
Dec 06 Java/Android
Java中Dijkstra(迪杰斯特拉)算法
May 20 Java/Android
Java界面编程实现界面跳转
Jun 16 Java/Android
Java服务调用RestTemplate与HttpClient的使用详解
Jun 21 Java/Android
Java实现HTML转为Word的示例代码
Jun 28 Java/Android
Android移动应用开发指南之六种布局详解
Sep 23 Java/Android
SpringBoot读取Resource下文件的4种方法
Jul 02 #Java/Android
Java基础-封装和继承
Java 泛型详解(超详细的java泛型方法解析)
SpringBoot集成Druid连接池连接MySQL8.0.11
Java使用httpRequest+Jsoup爬取红蓝球号码
使用Springboot实现健身房管理系统
Java Kafka 消费积压监控的示例代码
You might like
使用bcompiler对PHP文件进行加密的代码
2010/08/29 PHP
php生成静态页面的简单示例
2014/04/17 PHP
ThinkPHP模板比较标签用法详解
2014/06/30 PHP
Symfony2实现在controller中获取url的方法
2016/03/18 PHP
PHP指定截取字符串中的中英文或数字字符的实例分享
2016/03/18 PHP
php opendir()列出目录下所有文件的实例代码
2016/10/02 PHP
PHP实现重载的常用方法实例详解
2017/10/18 PHP
php实现微信公众平台发红包功能
2018/06/14 PHP
javascript 面向对象继承
2009/11/26 Javascript
js 全兼容可高亮二级缓冲折叠菜单
2010/06/04 Javascript
Iframe自适应高度绝对好使的代码 兼容IE,遨游,火狐
2011/01/27 Javascript
jQuery实现点击标题输入详细信息
2013/04/16 Javascript
BOOTSTRAP时间控件显示在模态框下面的bug修复
2015/02/05 Javascript
TypeScript 学习笔记之基本类型
2015/06/19 Javascript
jQuery图片轮播滚动切换代码分享
2020/04/20 Javascript
jQuery实时显示鼠标指针位置和键盘ASCII码
2016/03/28 Javascript
JS实现的自动打字效果示例
2017/03/10 Javascript
js仿微信公众平台打标签功能
2017/04/08 Javascript
让Vue也可以使用Redux的方法
2018/05/23 Javascript
详解webpack 热更新优化
2018/09/13 Javascript
解决vuecli3.0热更新失效的问题
2018/09/19 Javascript
Node.js原生api搭建web服务器的方法步骤
2019/02/15 Javascript
小程序实现分类页
2019/07/12 Javascript
[51:36]EG vs VP 2018国际邀请赛淘汰赛BO3 第一场 8.24
2018/08/25 DOTA
Python列表生成器的循环技巧分享
2015/03/06 Python
python版学生管理系统
2018/01/10 Python
Python操作mongodb数据库的方法详解
2018/12/08 Python
Python3.5基础之函数的定义与使用实例详解【参数、作用域、递归、重载等】
2019/04/26 Python
python使用rsa非对称加密过程解析
2019/12/28 Python
Numpy(Pandas)删除全为零的列的方法
2020/09/11 Python
python excel多行合并的方法
2020/12/09 Python
2015年小学生自我评价范文
2015/03/03 职场文书
复活读书笔记
2015/06/29 职场文书
Nginx解决前端访问资源跨域问题的方法详解
2021/03/31 Servers
四十九个javascript小知识实用技巧
2021/11/20 Javascript
Win10鼠标轨迹怎么开 Win10显示鼠标轨迹方法
2022/04/06 数码科技