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 相关文章推荐
swagger如何返回map字段注释
Jul 03 Java/Android
详细了解java监听器和过滤器
Jul 09 Java/Android
在Spring-Boot中如何使用@Value注解注入集合类
Aug 02 Java/Android
关于ObjectUtils.isEmpty() 和 null 的区别
Feb 28 Java/Android
Spring事务管理下synchronized锁失效问题的解决方法
Mar 31 Java/Android
springboot入门 之profile设置方式
Apr 04 Java/Android
Java 深入探究讲解简单工厂模式
Apr 07 Java/Android
SpringCloud项目如何解决log4j2漏洞
Apr 10 Java/Android
java高级用法JNA强大的Memory和Pointer
Apr 19 Java/Android
Java工作中实用的代码优化技巧分享
Apr 21 Java/Android
Android 中的类文件和类加载器详情
Jun 05 Java/Android
springboot实现string转json json里面带数组
Jun 16 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中强制下载文件的代码(解决了IE下中文文件名乱码问题)
2011/05/09 PHP
php删除与复制文件夹及其文件夹下所有文件的实现代码
2013/01/23 PHP
深入分析php中接口与抽象类的区别
2013/06/08 PHP
一个严格的PHP Session会话超时时间设置方法
2014/06/10 PHP
php邮件发送的两种方式
2020/04/28 PHP
PHP微商城开源代码实例
2019/03/27 PHP
javascript attachEvent和addEventListener使用方法
2009/03/19 Javascript
深入理解JavaScript系列(3) 全面解析Module模式
2012/01/15 Javascript
单击按钮显示隐藏子菜单经典案例
2013/01/04 Javascript
jquery 循环显示div的示例代码
2013/10/18 Javascript
用js替换除数字与逗号以外的所有字符的代码
2014/06/07 Javascript
node.js中的querystring.stringify方法使用说明
2014/12/10 Javascript
javascript实现checkbox全选的代码
2015/04/30 Javascript
javascript实现鼠标点击页面 移动DIV
2016/12/02 Javascript
Vue2.x中的父子组件相互通信的实现方法
2017/05/02 Javascript
Javascript实现一个简单的输入关键字添加标签效果实例
2017/06/01 Javascript
Angular 4依赖注入学习教程之ClassProvider的使用(三)
2017/06/04 Javascript
jQuery事件对象的属性和方法详解
2017/09/09 jQuery
解决vue 格式化银行卡(信用卡)每4位一个符号隔断的问题
2018/09/14 Javascript
浅析JavaScript异步代码优化
2019/03/18 Javascript
详解vuex之store源码简单解析
2019/06/13 Javascript
使用Vant完成通知栏Notify的提示操作
2020/11/11 Javascript
[42:04]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#3Secret VS OG第一局
2016/03/03 DOTA
Python和JavaScript间代码转换的4个工具
2016/02/22 Python
Python应用03 使用PyQT制作视频播放器实例
2016/12/07 Python
Django 添加静态文件的两种实现方法(必看篇)
2017/07/14 Python
Python如何定义接口和抽象类
2020/07/28 Python
详解python命令提示符窗口下如何运行python脚本
2020/09/11 Python
DRF使用simple JWT身份验证的实现
2021/01/14 Python
详解Canvas实用库Fabric.js使用手册
2019/01/07 HTML / CSS
住宅质量保证书
2014/04/29 职场文书
社区两委对照检查材料
2014/08/23 职场文书
2016年寒假见闻
2015/10/10 职场文书
详解php中流行的rpc框架
2021/05/29 PHP
压缩Redis里的字符串大对象操作
2021/06/23 Redis
Django基础CBV装饰器和中间件
2022/03/22 Python