这篇文章主要介绍了解决@RequestMapping和@FeignClient放在同一个接口上遇到的坑,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
@RequestMapping和@FeignClient放同一个接口的坑
@RequestMapping("/user/admin")
@FeignClient(ServiceNameConstants.USER_ADMIN_SERVICE)
public interface IUserAdminAuthApi {
...
}
原因
在SpringCloudGateway中,当一个接口上同时拥有@RequestMapping和@FeignClient注解时, 请求会报异常
解决方法
把@RequestMapping放到方法上
FeignClient上的RequestMapping不能生效
问题
我有两个FeignClient共同继承了一个接口,两个Client有各自不同的url实现,其中一个需要加上类似于@RequestMapping作用在类上的效果,因为@RequestMapping在FeignClient中作用在方法上是有效的,如果和@Controller一样放在类上是不是能实现呢,试了一下发现@RequestMapping与@FeignClient共同作用在一个类上时并不会生效。
原因
通过源码可得FeignClient注入时通过FeignClientFactoryBean进行Bean的初始化,在其中并没有对RequestMapping进行处理。
解决过程
小知识1:FeignClient是一个通过HTTP协议进行请求的RPC框架,而且是使用的RestTemplate进行封装的,那么其中肯定有对url的封装。我只需要找到在封装url时看看能不能加上一段地址就好。
小知识2:在依赖注入时SpringFactory会通过doGetBean()方法去找到对应的Bean信息, 如果该Instance是一个BeanFactory那么会通过Beanfactory.getObject()来获取对象。那么我只需要进入到FeignClienFactoryBean中查看对应的方法就好了。
那么在源码中找到了对应的处理代码如下:
this.url = this.url + this.cleanPath();
private String cleanPath() {
String path = this.path.trim();
if (StringUtils.hasLength(path)) {
if (!path.startsWith("/")) {
path = "/" + path;
}
if (path.endsWith("/")) {
path = path.substring(0, path.length() - 1);
}
}
return path;
}
在上述代码中可以发现可以通过设置path属性来达到我要的效果。
结果
通过设置@FeignClient中的path属性可以完成我所需的效果。
@FeignClient(name="serviceName", url = "http://localhost:8080", path="value")
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程学习网。
本文标题为:解决@RequestMapping和@FeignClient放在同一个接口上遇到的坑


基础教程推荐
- jsp hibernate的分页代码第3/3页 2024-01-11
- 用javascript制作qq注册动态页面 2023-12-16
- 关于@MapperScan包扫描的坑及解决 2023-04-16
- SpringBoot 2.5.5整合轻量级的分布式日志标记追踪神器TLog的详细过程 2023-06-17
- JSP servlet实现文件上传下载和删除 2023-07-30
- java 解决Eclipse挂掉问题的方法 2024-01-10
- SpringBoot嵌入式Web容器原理与使用介绍 2023-06-17
- springboot中request和response的加解密实现代码 2022-12-08
- 详解http请求中的Content-Type 2023-07-31
- Spring MVC数据绑定方式 2023-06-30