问题描述
Spring MVC处理请求映射的RequestMappingHandlerMapping实现片段:
@Override
protected boolean isHandler(Class<?> beanType) {
return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}
从实现中我们看到,只要被扫描的类包含了@Controller注解或@RequestMapping注解,那么就会被加载进来。虽然@FeignClient定义修饰的服务消费端没有声明这些注解,但是当我们使用了继承特性的时候,那么这些注解就也会被服务消费者解析和加载
解决方法
扩展RequestMappingHandlerMapping的isHandler函数
@Configuration
@ConditionalOnClass({Feign.class})
public class FeignConfiguration {
@Bean
public WebMvcRegistrations feignWebRegistrations() {
return new WebMvcRegistrationsAdapter() {
@Override
public RequestMappingHandlerMapping getRequestMappingHandlerMapping() {
return new FeignRequestMappingHandlerMapping();
}
};
}
private static class FeignRequestMappingHandlerMapping extends RequestMappingHandlerMapping {
@Override
protected boolean isHandler(Class<?> beanType) {
return super.isHandler(beanType) &&
!AnnotatedElementUtils.hasAnnotation(beanType, FeignClient.class);
}
}
}
参考博文:
http://blog.didispace.com/spring-cloud-feignclient-problem/?utm_source=tuicool&utm_medium=referral