问题描述:
公司同事发现在 @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