关于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")

www.sobd.cc
www.somanba.cn
www.zuowenge.cn
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
@FeignClient和@RequestMapping是Spring框架中常用的注解,用于实现微服务之间的通信和URL映射。 @FeignClient注解用于声明一个Feign客户端接口,用于调用其他微服务的API。它需要指定要调用的微服务的名称,可以通过value或name属性指定。Feign客户端会根据接口定义自动创建代理对象,简化了与其他微服务的交互。 例如,假设有一个名为UserService的微服务,我们可以使用@FeignClient注解来声明一个与UserService交互的Feign客户端接口: ```java @FeignClient(name = "user-service") public interface UserFeignClient { @GetMapping("/users/{id}") User getUserById(@PathVariable("id") Long id); } ``` 在上面的例子中,我们声明了一个名为UserFeignClient的Feign客户端接口,它与名为"user-service"的微服务进行通信。接口中定义了一个getUserById方法,用于调用"user-service"提供的获取用户信息的API。 @RequestMapping注解用于将HTTP请求映射到控制器方法上。它可以用于类级别和方法级别。在类级别上使用@RequestMapping注解可以定义共享的请求前缀,而在方法级别上使用可以定义具体的请求路径和HTTP方法。 例如,我们可以在控制器类上使用@RequestMapping注解来定义请求前缀: ```java @RestController @RequestMapping("/api/users") public class UserController { // ... } ``` 在上面的例子中,所有以"/api/users"开头的请求都会被映射到UserController类中的方法上。 在方法级别上使用@RequestMapping注解可以指定具体的请求路径和HTTP方法。例如: ```java @RestController @RequestMapping("/api/users") public class UserController { @GetMapping("/{id}") public User getUserById(@PathVariable("id") Long id) { // ... } } ``` 在上面的例子中,GET请求"/api/users/{id}"会被映射到getUserById方法上,其中{id}是一个路径变量,用于指定要获取的用户的ID。 总结一下,@FeignClient用于声明Feign客户端接口,用于调用其他微服务的API;@RequestMapping用于将HTTP请求映射到控制器方法上,可以定义请求前缀、请求路径和HTTP方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值