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 18 Java/Android
SpringAop日志找不到方法的处理
Jun 21 Java/Android
springboot集成flyway自动创表的详细配置
Jun 26 Java/Android
Java Kafka 消费积压监控的示例代码
Jul 01 Java/Android
一篇文章带你学习Mybatis-Plus(新手入门)
Aug 02 Java/Android
浅谈sql_@SelectProvider及使用注意说明
Aug 04 Java/Android
Java数据开发辅助工具Docker与普通程序使用方法
Sep 15 Java/Android
java代码实现空间切割
Jan 18 Java/Android
SpringBoot2零基础到精通之数据与页面响应
Mar 22 Java/Android
详解Alibaba Java诊断工具Arthas查看Dubbo动态代理类
Apr 08 Java/Android
Java实现带图形界面的聊天程序
Jun 10 Java/Android
MyBatis在注解上使用动态SQL方式(@select使用if)
Jul 07 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上传、管理照片示例
2006/10/09 PHP
PHP memcache扩展的三种安装方法
2009/04/26 PHP
php更改目录及子目录下所有的文件后缀的代码
2010/09/24 PHP
在PHP中使用curl_init函数的说明
2010/11/02 PHP
php中判断文件空目录是否有读写权限的函数代码
2012/08/07 PHP
php中simplexml_load_file函数用法实例
2014/11/12 PHP
PHP设计模式(九)外观模式Facade实例详解【结构型】
2020/05/02 PHP
DHTML 中的绝对定位
2006/11/26 Javascript
Textarea与懒惰渲染实现代码
2012/01/04 Javascript
Ajax异步提交表单数据的说明及方法实例
2013/06/22 Javascript
jQuery自定义事件的简单实现代码
2014/01/27 Javascript
IE浏览器下PNG相关功能
2015/07/05 Javascript
javascript中select下拉框的用法总结
2016/01/07 Javascript
JavaScript比较当前时间是否在指定时间段内的方法
2016/08/02 Javascript
input框中的name和id的区别
2016/11/16 Javascript
jquery基于layui实现二级联动下拉选择(省份城市选择)
2017/06/20 jQuery
Vue.js常用指令之循环使用v-for指令教程
2017/06/27 Javascript
vue2.x 对象劫持的原理实现
2020/04/19 Javascript
uni-app如何页面传参数的几种方法总结
2020/04/28 Javascript
python判断一个集合是否包含了另外一个集合中所有项的方法
2015/06/30 Python
Python 中的range(),以及列表切片方法
2018/07/02 Python
Python解决pip install时出现的Could not fetch URL问题
2019/08/01 Python
解决Python二维数组赋值问题
2019/11/28 Python
Python 从attribute到property详解
2020/03/05 Python
python_matplotlib改变横坐标和纵坐标上的刻度(ticks)方式
2020/05/16 Python
快速创建python 虚拟环境
2020/11/28 Python
Django url 路由匹配过程详解
2021/01/22 Python
HTML5之SVG 2D入门2—图形绘制(基本形状)介绍及使用
2013/01/30 HTML / CSS
茵宝(Umbro)英国官方商店:英国足球服装生产商
2016/12/29 全球购物
机关财务管理制度
2014/01/17 职场文书
班组长岗位职责
2014/03/03 职场文书
小学教师评语大全
2014/04/23 职场文书
庆元旦演讲稿
2014/09/15 职场文书
2014年大学生党员评议表自我评价
2014/09/20 职场文书
物业客服专员岗位职责
2015/04/07 职场文书
英语读书笔记
2015/07/02 职场文书