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 Shutdown Hook场景使用及源码分析
Jun 15 Java/Android
总结一下关于在Java8中使用stream流踩过的一些坑
Jun 24 Java/Android
图解排序算法之希尔排序Java实现
Jun 26 Java/Android
使用Springboot实现健身房管理系统
Jul 01 Java/Android
dubbo服务整合zipkin详解
Jul 26 Java/Android
Spring Boot mybatis-config 和 log4j 输出sql 日志的方式
Jul 26 Java/Android
Java 实现限流器处理Rest接口请求详解流程
Nov 02 Java/Android
深入浅出讲解Java8函数式编程
Jan 18 Java/Android
Java 使用类型为Object的变量指向任意类型的对象
Apr 13 Java/Android
springboot为异步任务规划自定义线程池的实现
Jun 14 Java/Android
java实现web实时消息推送的七种方案
Jul 23 Java/Android
volatile保证可见性及重排序方法
Aug 05 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
Discuz!5的PHP代码高亮显示插件(黑暗中的舞者更新)
2007/01/29 PHP
php DOS攻击实现代码(附如何防范)
2012/05/29 PHP
PHP 循环删除无限分类子节点的实现代码
2013/06/21 PHP
浅析php中常量,变量的作用域和生存周期
2013/08/10 PHP
Centos 6.5下PHP 5.3安装ffmpeg扩展的步骤详解
2017/03/02 PHP
php curl获取到json对象并转成数组array的方法
2018/05/31 PHP
PHP精确到毫秒秒杀倒计时实例详解
2019/03/14 PHP
PHP开发实现快递查询功能详解
2019/04/08 PHP
Laravel如何同时连接多个数据库详解
2019/08/13 PHP
laravel5环境隐藏index.php后缀(apache)的方法
2019/10/12 PHP
简单的JS多重继承示例
2008/03/13 Javascript
.net,js捕捉文本框回车键事件的小例子(兼容多浏览器)
2013/03/11 Javascript
仿新浪微博登陆邮箱提示效果的js代码
2013/08/02 Javascript
js获取控件位置以及不同浏览器中的差别介绍
2013/08/08 Javascript
详解JavaScript中的every()方法
2015/06/08 Javascript
JS+CSS实现的漂亮渐变背景特效代码(6个渐变效果)
2016/03/25 Javascript
leaflet的开发入门教程
2016/11/17 Javascript
原生js实现随机点名
2020/07/05 Javascript
JS图片懒加载技术实现过程解析
2020/07/27 Javascript
11个并不被常用但对开发非常有帮助的Python库
2015/03/31 Python
python中字典(Dictionary)用法实例详解
2015/05/30 Python
python分批定量读取文件内容,输出到不同文件中的方法
2018/12/08 Python
Django 在iframe里跳转顶层url的例子
2019/08/21 Python
Python 批量刷博客园访问量脚本过程解析
2019/08/30 Python
如何使用Python多线程测试并发漏洞
2019/12/18 Python
Pycharm pyuic5实现将ui文件转为py文件,让UI界面成功显示
2020/04/08 Python
Django 解决model 反向引用中的related_name问题
2020/05/19 Python
解决keras backend 越跑越慢问题
2020/06/18 Python
html5 canvas简单封装一个echarts实现不了的饼图
2018/06/12 HTML / CSS
英国探险旅游专家:Explore
2018/12/20 全球购物
台湾时尚彩瞳专门店:imeime
2019/08/16 全球购物
解释一下抽象方法和抽象类
2016/08/27 面试题
外贸业务员的岗位职责
2013/11/23 职场文书
考试违纪检讨书
2014/02/02 职场文书
企业办公室岗位职责
2014/03/12 职场文书
《普罗米修斯》教学反思
2016/02/22 职场文书