spring clound 项目 @FeignClient 上加 @RequestMapping 注解远程调用报错解决

问题描述:

      公司同事发现在 @FeignClient上配置 @RequestMapping 注解后导致远程调用不通,同时本模块在 swagger上会出现远程调用的接口,但是这个接口其实不应该展示在本模块 swagger接口目录上的。

      写法如下:

        然后改成下面这种写法就可以调用成功了 

 

       然后说@FeignClient 应该是不支持 @RequestMapping 注解,但是我觉得不太应该,我记得在之前项目也用过类似写法,刚刚我比较空闲一点,就想着把这个问题处理了。
 

解决:

1.  远程调用报错:  org.springframework.security.web.firewall.RequestRejectedException: The request was rejected because the URL was not normalized. 

    我在本地启动这两个服务,发现调用出现如下错误:

 

然后网上看了下,这个错误大多出现在URL配置不正确,导致不匹配的情况,然后仔细看了下代码,发现是URL后面多了一个/,改成如下形式就可以成功调用了。

 

2. swagger  上显示@FeignClient 修饰的接口

      多余显示的url如图所示:

原因:在 RequestMappingHandlerMapping 有一个isHandler() 方法,在这个方法上判断了被 @Controller 和  @RequestMapping 注解修饰的类就是一个处理请求的Handler处理类,如下:

protected boolean isHandler(Class<?> beanType) {
        return AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) || AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class);
    }

所以我们只需要重写下这个类就行了。增加下面配置类,把同时又被@FeignClient注解修饰的过滤就可以了。

package com.iunicorn.mall.middle.starter.common.config;

import feign.Feign;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.web.servlet.WebMvcRegistrations;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.AnnotatedElementUtils;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;

/**
 * @Title: FeignConfiguration
 * @Description: feign配置
 * @date : 2020/10/14 15:37
 */
@Configuration
@ConditionalOnClass({Feign.class})
public class FeignConfiguration {

    @Bean
    public WebMvcRegistrations feignWebRegistrations() {
        return new WebMvcRegistrations() {
            @Override
            public RequestMappingHandlerMapping getRequestMappingHandlerMapping() {
                return new FeignRequestMappingHandlerMapping();
            }
        };
    }

    /**
     * swagger过滤同时被 @FeignClient和@RequestMapping 修饰的类
     */
    private static class FeignRequestMappingHandlerMapping extends RequestMappingHandlerMapping {
        @Override
        protected boolean isHandler(Class<?> beanType) {
            return super.isHandler(beanType) &&
                    !AnnotatedElementUtils.hasAnnotation(beanType, FeignClient.class);
        }
    }
}



   参考资料: https://blog.csdn.net/andy_zhang2007/article/details/90573633

http://blog.didispace.com/spring-cloud-feignclient-problem/?utm_source=tuicool&utm_medium=referral

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
@FeignClientSpring Cloud中的一个注解,用于定义一个声明式的REST客户端。它可以与@RequestMapping注解一起使用,但不支持直接在@FeignClient上使用@RequestMapping注解。 @RequestMapping注解通常用于定义控制器的请求映射。在RequestMappingHandlerMapping类中,有一个isHandler()方法用于判断被@Controller和@RequestMapping注解修饰的类是否是一个处理请求的处理类。这是因为@Controller和@RequestMapping注解Spring MVC的一部分,而Feign是用于实现服务间通信的,所以在Feign中不直接支持@RequestMapping注解。 如果需要在Feign中使用@RequestMapping注解,有两种方法可以解决。一种是将@RequestMapping注解加在Feign接口的方法上,而不是加在接口类上。另一种是将@RequestMapping注解加在Feign接口的实现类上。在这种情况下,接口类和实现类的@RequestMapping注解需要保持一致,Feign的@FeignClient注解中的path属性用于指定调用者的Feign代理路径,而@RequestMapping注解则指定实际的访问路径。 总结来说,尽管@FeignClient本身不支持@RequestMapping注解,但可以通过将@RequestMapping注解加在Feign接口的方法上或实现类上来实现类似的功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [spring clound 项目 @FeignClient 上加 @RequestMapping 注解远程调用报错解决](https://blog.csdn.net/qq_33071429/article/details/109092922)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [openfeign服务调用多模块项目加前缀(@RequestMapping(“/path“))需要注意的设置](https://blog.csdn.net/weixin_43766182/article/details/121479607)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值