这篇文章主要介绍“@RequestMapping和@FeignClient放在同一个接口上遇到的坑如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“@RequestMapping和@FeignClient放在同一个接口上遇到的坑如何解决”文章能帮助大家解决问题。
@RequestMapping("/user/admin") @FeignClient(ServiceNameConstants.USER_ADMIN_SERVICE) public interface IUserAdminAuthApi { ... }
在SpringCloudGateway中,当一个接口上同时拥有@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放在同一个接口上遇到的坑如何解决”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注亿速云行业资讯频道,小编每天都会为大家更新不同的知识点。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。