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 11 Java/Android
Java内存模型之happens-before概念详解
Jun 13 Java/Android
IDEA使用SpringAssistant插件创建SpringCloud项目
Jun 23 Java/Android
Java基础之this关键字的使用
Jun 30 Java/Android
Java后台生成图片的完整步骤
Aug 04 Java/Android
springboot 多数据源配置不生效遇到的坑及解决
Nov 17 Java/Android
SpringBoot整合阿里云视频点播的过程详解
Dec 06 Java/Android
Flutter Navigator 实现路由传递参数
Apr 22 Java/Android
Java死锁的排查
May 11 Java/Android
Spring JPA 增加字段执行异常问题及解决
Jun 10 Java/Android
Spring中bean集合注入的方法详解
Jul 07 Java/Android
springboot+rabbitmq实现智能家居实例详解
Jul 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自动给文章加关键词链接的函数代码
2012/11/29 PHP
PHP生成随机数的方法实例分析
2015/01/22 PHP
php、mysql查询当天,查询本周,查询本月的数据实例(字段是时间戳)
2017/02/04 PHP
PHP验证码无法显示的原因及解决办法
2017/08/11 PHP
Mozilla中显示textarea中选择的文字
2006/09/07 Javascript
javascript 当前日期加(天、周、月、年)
2009/08/09 Javascript
jQuery ajax dataType值为text json探索分享
2013/09/23 Javascript
AngularJS directive返回对象属性详解
2016/03/28 Javascript
JavaScript中的Object对象学习教程
2016/05/20 Javascript
JS分页的实现(同步与异步)
2017/09/16 Javascript
基于 flexible 的 Vue 组件:Toast -- 显示框效果
2017/12/26 Javascript
nodejs实现的简单web服务器功能示例
2018/03/15 NodeJs
javascript中floor使用方法总结
2019/02/02 Javascript
Angular使用ControlValueAccessor创建自定义表单控件
2019/03/08 Javascript
[00:33]2018DOTA2亚洲邀请赛TNC出场
2018/04/04 DOTA
深入讲解Python中面向对象编程的相关知识
2015/05/25 Python
Saltstack快速入门简单汇总
2016/03/01 Python
Python编程之微信推送模板消息功能示例
2017/08/21 Python
python中print()函数的“,”与java中System.out.print()函数中的“+”功能详解
2017/11/24 Python
pip install urllib2不能安装的解决方法
2018/06/12 Python
Python 判断文件或目录是否存在的实例代码
2018/07/19 Python
Python3编码问题 Unicode utf-8 bytes互转方法
2018/10/26 Python
python判断一个数是否能被另一个整数整除的实例
2018/12/12 Python
详解Python中的各种转义符\n\r\t
2019/07/10 Python
查看已安装tensorflow版本的方法示例
2020/04/19 Python
用Python进行websocket接口测试
2020/10/16 Python
亚洲独特体验旅游专家:eOasia
2018/08/15 全球购物
欧洲领先的技术商店:eibmarkt.com
2019/05/10 全球购物
UNOde50美国官网:西班牙珠宝品牌
2020/08/15 全球购物
5.1手机促销活动
2014/01/17 职场文书
初中优秀班集体申报材料
2014/05/01 职场文书
上课睡觉检讨书300字
2014/11/18 职场文书
python实现自动化群控的步骤
2021/04/11 Python
LayUI+Shiro实现动态菜单并记住菜单收展的示例
2021/05/06 Javascript
Python内置类型集合set和frozenset的使用详解
2022/04/26 Python
win10电脑右下角输入法图标不见了?Win10右下角不显示输入法的解决方法
2022/07/23 数码科技