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 Nio使用NioSocket客户端与服务端交互实现方式
Jun 15 Java/Android
ConstraintValidator类如何实现自定义注解校验前端传参
Jun 18 Java/Android
详解Java实践之抽象工厂模式
Jun 18 Java/Android
Java基于字符界面的简易收银台
Jun 26 Java/Android
Java 数组内置函数toArray详解
Jun 28 Java/Android
详解Java ES多节点任务的高效分发与收集实现
Jun 30 Java/Android
Java实现聊天机器人完善版
Jul 04 Java/Android
RestTemplate如何通过HTTP Basic Auth认证示例说明
Mar 17 Java/Android
springboot+zookeeper实现分布式锁
Mar 21 Java/Android
Spring Boot DevTools 全局配置学习指南
Mar 31 Java/Android
JavaScript正则表达式实现注册信息校验功能
May 30 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中session退出登陆问题
2014/02/27 PHP
2款PHP无限级分类实例代码
2015/11/11 PHP
PHP的Yii框架中行为的定义与绑定方法讲解
2016/03/18 PHP
php实现网页端验证码功能
2017/07/11 PHP
PHP共享内存使用与信号控制实例分析
2018/05/09 PHP
PHP5.6读写excel表格文件操作示例
2019/02/26 PHP
tp5(thinkPHP5框架)时间查询操作实例分析
2019/05/29 PHP
Laravel6.0.4中将添加计划任务事件的方法步骤
2019/10/15 PHP
document.getElementById方法在Firefox与IE中的区别
2010/05/18 Javascript
dreamweaver 8实现Jquery自动提示
2014/12/04 Javascript
分享JavaScript与Java中MD5使用两个例子
2015/12/23 Javascript
Ubuntu 16.04 64位中搭建Node.js开发环境教程
2016/10/19 Javascript
webuploader模态框ueditor显示问题解决方法
2016/12/27 Javascript
bootstrap制作jsp页面(根据值让table显示选中)
2017/01/05 Javascript
基于vue-ssr服务端渲染入门详解
2018/01/08 Javascript
Vue波纹按钮组件制作
2018/04/30 Javascript
在vue中读取本地Json文件的方法
2018/09/06 Javascript
python使用电子邮件模块smtplib的方法
2016/08/28 Python
Python 实现一行输入多个值的方法
2018/04/21 Python
对pandas的层次索引与取值的新方法详解
2018/11/06 Python
python-docx文件定位读取过程(尝试替换)
2020/02/13 Python
利用scikitlearn画ROC曲线实例
2020/07/02 Python
Python3 用什么IDE开发工具比较好
2020/11/28 Python
让IE可以变相支持CSS3选择器
2010/01/21 HTML / CSS
Aveda美国官网:天然护发产品、洗发水、护发素和沙龙
2016/12/09 全球购物
SQL Server面试题
2013/04/04 面试题
专科毕业生自我鉴定
2013/12/01 职场文书
大学生的网上创业计划书
2013/12/31 职场文书
北京奥运会口号
2014/06/21 职场文书
主题团日活动总结
2014/06/25 职场文书
美术课外活动总结
2014/07/08 职场文书
2015年五一劳动节活动总结
2015/02/09 职场文书
2015国庆节宣传语
2015/07/14 职场文书
健身房被搭讪?用python写了个小米计时器助人为乐
2021/06/08 Python
MySQL 外连接语法之 OUTER JOIN
2022/04/09 MySQL
Flink 侧流输出源码示例解析
2022/09/23 Servers