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 相关文章推荐
Spring Bean的实例化之属性注入源码剖析过程
Jun 13 Java/Android
java Nio使用NioSocket客户端与服务端交互实现方式
Jun 15 Java/Android
浅谈Python魔法方法
Jun 28 Java/Android
Java比较两个对象中全部属性值是否相等的方法
Aug 07 Java/Android
SpringDataJPA实体类关系映射配置方式
Dec 06 Java/Android
Java实现学生管理系统(IO版)
Feb 24 Java/Android
剑指Offer之Java算法习题精讲二叉树专项训练
Mar 21 Java/Android
Spring Boot 底层原理基础深度解析
Apr 03 Java/Android
Java 异步任务计算FutureTask
Apr 28 Java/Android
Java存储没有重复元素的数组
Apr 29 Java/Android
多线程Spring通过@Scheduled实现定时任务
May 25 Java/Android
Java使用HttpClient实现文件下载
Aug 14 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 登录记住密码实现思路
2013/05/07 PHP
Apache启动报错No space left on device: AH00023该怎么解决
2015/10/16 PHP
[原创]PHP简单开启curl的方法(测试可行)
2016/01/11 PHP
PHP基于session.upload_progress 实现文件上传进度显示功能详解
2019/08/09 PHP
TP5框架页面跳转样式操作示例
2020/04/05 PHP
JQueryEasyUI datagrid框架的进阶使用
2013/04/08 Javascript
基于javascript实现单选及多选的向右和向左移动实例
2015/07/25 Javascript
轮播图组件js代码
2016/08/08 Javascript
详解JS去重及字符串奇数位小写转大写
2016/12/29 Javascript
原生js实现放大镜效果
2017/01/11 Javascript
jquery,js简单实现类似Angular.js双向绑定
2017/01/13 Javascript
jQuery的三种bind/One/Live/On事件绑定使用方法
2017/02/23 Javascript
基于JavaScript实现简单的音频播放功能
2018/01/07 Javascript
详解Vue.js中.native修饰符
2018/04/24 Javascript
JS实现动态生成html table表格的方法分析
2018/07/11 Javascript
react组件从搭建脚手架到在npm发布的步骤实现
2019/01/09 Javascript
Vue组件内部实现一个双向数据绑定的实例代码
2019/04/04 Javascript
ajaxfileupload.js实现上传文件功能
2019/04/19 Javascript
vue项目页面嵌入代码块vue-prism-editor的实现
2020/10/30 Javascript
[02:22]2018DOTA2亚洲邀请赛VG赛前采访
2018/04/03 DOTA
[01:12:35]Spirit vs Navi Supermajor小组赛 A组败者组第一轮 BO3 第二场 6.2
2018/06/03 DOTA
使用Python判断IP地址合法性的方法实例
2014/03/13 Python
python编写Logistic逻辑回归
2020/12/30 Python
Python实现PS图像调整之对比度调整功能示例
2018/01/26 Python
在双python下设置python3为默认的方法
2018/10/31 Python
Apache部署Django项目图文详解
2019/07/30 Python
python实现学生成绩测评系统
2020/06/22 Python
Python unittest装饰器实现原理及代码
2020/09/08 Python
不可轻视HTML5!App三年内将被html5顶替彻底消失
2015/11/18 HTML / CSS
localStorage的过期时间设置的方法详解
2018/11/26 HTML / CSS
Html5 页面适配iPhoneX(就是那么简单)
2019/09/05 HTML / CSS
前处理组长岗位职责
2014/03/01 职场文书
2014年实习班主任工作总结
2014/11/08 职场文书
全陪导游词开场白
2015/05/29 职场文书
Python实现照片卡通化
2021/12/06 Python
Linux磁盘管理方法介绍
2022/06/01 Servers