SpringBoot工程下使用OpenFeign的坑及解决
作者:小林June 发布时间:2022-08-24 18:00:38
一、前言
在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();
}
完成以上的配置就可以进行正常的调用了,该问题困扰我好几天了今天终于解决了(真不容易),希望该文章没有白写。
最后感谢这篇文章让我在放弃的时候找到了思路。(调试中遇到的细节问题就不在此进行赘述了)
来源:https://blog.csdn.net/feiyst/article/details/88677223


猜你喜欢
- SpringAOP的介绍:传送门demo介绍主要通过自定义注解,使用SpringAOP的环绕通知拦截请求,判断该方法是否有自定义注解,然后判
- Cocos2d-x引擎的核心是用C++编写的,那对于所有使用该引擎的游戏开发人员来说,内存管理是一道绕不过去的坎。关于Cocos2d-x内存
- 本文实例讲述了Android实现的数字格式化用法。分享给大家供大家参考,具体如下:package formatnumber;import j
- 引入腾讯云依赖 <!--腾讯云核心API--> <dependency> <groupId>
- 导入maven依赖<!-- https://mvnrepository.com/artifact/com.fasterxml.jack
- 我就废话不多说了,大家还是直接看代码吧~ @Test void testJava8ForeachMap() { Map<String,
- 一、指标监控引入jar包: <dependency> &nb
- 用途项目中使用了 dubbo,注册中心使用的 zookeeper,使用 zookeeper 实现了一个简单的分布式锁(依赖 curator)
- 本文实例为大家分享了Java实现简易俄罗斯方块的具体代码,供大家参考,具体内容如下一、将对象抽象为类首先考虑俄罗斯方块游戏中含有哪些具体的对
- 我们今天来聊下如何做实时通讯(先给知识点,实现原理,最后给出实现实时通信的具体代码--使用工具 android studio)现在先说下用到
- 话不多说,请看代码:<!DOCTYPE html><html><head> <meta
- application.properties有以下这几条数据方法一:@Value注解+@Component建议properties少的时候用
- 本文实例为大家分享了Unity Shader实现3D翻页效果的具体代码,供大家参考,具体内容如下参考文章:UnityShader使用Plan
- 上一篇文章: # Android 10 启动分析之Zygote篇 (三)紧接着上一篇文章的内容,我们从这篇文章开始来分析一下 SystemS
- 提到Java发送HTTP请求,大家首先想到的是用apache的HttpClient,或者squareup的OkHttp。而在Java11之前
- 本节了解一下 SpringBoot 中 Web 开发的静态资源导入和首页设置,对应 SpringBoot-03-Web 项目。1. 静态资源
- 前言Docker旨在提供一种应用程序的自动化部署解决方案,在 Linux 系统上迅速创建一个容器(轻量级虚拟机)并部署和运行应用程序,并通过
- 前言本次主要是实现一个Android应用,实现静态广播、动态广播两种改变 widget内容的方法,即在上篇博文中实验的基础上进行修改,所以此
- 本文实例为大家分享了Java实现聊天机器人完善版的具体代码,供大家参考,具体内容如下Client代码:package GUISocket.c
- 本文实例讲述了C#中使用ADOMD.NET查询多维数据集的实现方法,分享给大家供大家参考。具体实现方法分析如下:ADOMD.NET 是用于与