解决@RequestMapping和@FeignClient放在同一个接口上遇到的坑

 更新时间:2022年07月04日 09:29:14   作者:AWen_Jack  
这篇文章主要介绍了解决@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")

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java中接口和抽象类的区别与相同之处

    Java中接口和抽象类的区别与相同之处

    这篇文章主要介绍了Java中接口和抽象类的区别与相同之处,本文讲解了抽象类的概念、接口的概念、接口和抽象类的区别与联系等内容,需要的朋友可以参考下
    2015-06-06
  • SpringBoot实现拦截器、过滤器、监听器过程解析

    SpringBoot实现拦截器、过滤器、监听器过程解析

    这篇文章主要介绍了SpringBoot实现拦截器、过滤器、监听器过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • 关于SpingMVC的<context:component-scan>包扫描踩坑记录

    关于SpingMVC的<context:component-scan>包扫描踩坑记录

    这篇文章主要介绍了关于SpingMVC的<context:component-scan>包扫描踩坑记录,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Java批量从svn导出多个项目代码实例

    Java批量从svn导出多个项目代码实例

    这篇文章主要介绍了java批量从svn导出多个项目代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • maven基础教程——简单了解maven的特点与功能

    maven基础教程——简单了解maven的特点与功能

    这篇文章主要介绍了Maven基础教程的相关资料,文中讲解非常细致,帮助大家开始学习maven,感兴趣的朋友可以了解下
    2020-07-07
  • Spring Boot获取微信用户信息的超简单方法

    Spring Boot获取微信用户信息的超简单方法

    这篇文章主要给大家介绍了关于Spring Boot获取微信用户信息的超简单方法,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring Boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • Spring Cloud Config Client超时及重试示例详解

    Spring Cloud Config Client超时及重试示例详解

    这篇文章主要给大家介绍了关于Spring Cloud Config Client超时及重试的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2018-05-05
  • Java设计模式之命令模式(Command模式)介绍

    Java设计模式之命令模式(Command模式)介绍

    这篇文章主要介绍了Java设计模式之命令模式(Command模式)介绍,本文讲解了Command模式的定义、如何使用命令模式等内容,需要的朋友可以参考下
    2015-03-03
  • Springboot2.7+Minio8 实现大文件分片上传

    Springboot2.7+Minio8 实现大文件分片上传

    本文主要介绍了Springboot2.7+Minio8 实现大文件分片上传,通过文件切片上传,我们能够提高文件上传的速度,优化用户体验,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • Spring Cloud EureKa Ribbon 服务注册发现与调用

    Spring Cloud EureKa Ribbon 服务注册发现与调用

    这篇文章主要介绍了Spring Cloud EureKa Ribbon 服务注册发现与调用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02

最新评论