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 相关文章推荐
Netty结合Protobuf进行编解码的方法
Jun 26 Java/Android
简单总结SpringMVC拦截器的使用方法
Jun 28 Java/Android
swagger如何返回map字段注释
Jul 03 Java/Android
gateway网关接口请求的校验方式
Jul 15 Java/Android
SpringCloud之@FeignClient()注解的使用方式
Sep 25 Java/Android
Java 在线考试云平台的实现
Nov 23 Java/Android
alibaba seata服务端具体实现
Feb 24 Java/Android
Java实战之课程信息管理系统的实现
Apr 01 Java/Android
利用正则表达式匹配浮点型数据
May 30 Java/Android
Spring Security动态权限的实现方法详解
Jun 16 Java/Android
java.util.NoSuchElementException原因及两种解决方法
Jun 28 Java/Android
Mybatis 一级缓存和二级缓存原理区别
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
php获取当前页面完整URL地址
2015/12/30 PHP
Laravel实现ApiToken认证请求
2019/10/14 PHP
JavaScript中void(0)的具体含义解释
2007/02/27 Javascript
用JTrackBar实现的模拟苹果风格的滚动条
2007/08/06 Javascript
javascript自启动函数的问题探讨
2013/10/05 Javascript
jquery弹窗插件colorbox绑定动态生成元素的方法
2014/06/20 Javascript
node.js中的定时器nextTick()和setImmediate()区别分析
2014/11/26 Javascript
nodejs实例解析(输出hello world)
2017/01/03 NodeJs
BootStrap 弹出层代码
2017/02/09 Javascript
浅谈Vue 初始化性能优化
2017/08/31 Javascript
Node.js学习教程之HTTP/2服务器推送【译】
2017/10/31 Javascript
zTree节点文字过多的处理方法
2017/11/24 Javascript
JS 中document.write()的用法和清空的原因浅析
2017/12/04 Javascript
使用Angular 6创建各种动画效果的方法
2018/10/10 Javascript
深入浅析nuxt.js基于ssh的vue通用框架
2019/05/21 Javascript
Vue-cli 移动端布局和动画使用详解
2020/08/10 Javascript
[51:14]LGD vs VP 2018国际邀请赛淘汰赛BO3 第一场 8.21
2018/08/22 DOTA
使用go和python递归删除.ds store文件的方法
2014/01/22 Python
python重试装饰器示例
2014/02/11 Python
深入解析Python中的lambda表达式的用法
2015/08/28 Python
Python实现八大排序算法
2016/08/13 Python
python安装cx_Oracle模块常见问题与解决方法
2017/02/21 Python
Python类的动态修改的实例方法
2017/03/24 Python
Python实现采用进度条实时显示处理进度的方法
2017/12/19 Python
python编程实现随机生成多个椭圆实例代码
2018/01/03 Python
python 列表,数组和矩阵sum的用法及区别介绍
2018/06/28 Python
Python Pandas 获取列匹配特定值的行的索引问题
2019/07/01 Python
Python 画出来六维图
2019/07/26 Python
Python+Kepler.gl轻松制作酷炫路径动画的实现示例
2020/06/02 Python
美国唇部护理专家:Sara Happ
2019/06/19 全球购物
随机分配座位,共50个学生,使学号相邻的同学座位不能相邻
2014/01/18 面试题
事业单位请假制度
2014/01/13 职场文书
工程款申请报告
2015/05/15 职场文书
工作经历证明范本
2015/06/15 职场文书
Django一小时写出账号密码管理系统
2021/04/29 Python
一文弄懂MySQL中redo log与binlog的区别
2022/02/15 MySQL