SpringCloud中Feign踩坑整理
问题1:注解冲突 @EnableFeignClients与@ComponentScan有冲突 两种注解都会搜索注入指定目录中的bean @EnableFeignClients 引入了FeignClientsRegistrar类,实现了spring的bean、资源的加载
FeignClientsRegistrar中registerFeignClients获取了@EnableFeignClients注解中的basepackage值,并进行注入
问题2:EnableFeignClients未指定包扫描导致无效 示例:@EnableFeignClients(basePackages = {“com.xxx.xxx”,“com.xxx.xxx.xxx”}) 使用该注解务必添加basePackages
问题3:@SpringCloudApplication 与 @EnableFeignClients 注解同时使用时需要注意 添加@EnableAutoConfiguration(excludeName = {“org.springframework.cloud.netflix.ribbon.RibbonAutoConfiguration”}) 目前已知的原因为: 1、SpringCloudApplication与EnableFeignClients 均对 LoadBalancerClient 进行了实例化 2、 SpringCloudApplication 默认实例化的是 RibbonLoadBalancerClient 3、EnableFeignClients 实例化的是 BlockingLoadBalancerClient 4、RibbonLoadBalancerClient所在的项目中的META-INF下的spring.factories中加载的是org.springframework.cloud.netflix.ribbon.RibbonAutoConfiguration 5、在RibbonAutoConfiguration类中获取LoadBalancerClient的方法中,有@ConditionalOnMissingBean注解 6、@ConditionalOnMissingBean注解表示如果IOC容器中有了就不再创建了 7、所以得出结论为:@SpringCloudApplication 与 @EnableFeignClients顺序执行时只保留了一个LoadBalancerClient类 8、可以添加@EnableAutoConfiguration(excludeName = {“org.springframework.cloud.netflix.ribbon.RibbonAutoConfiguration”})注解的方式进行解决 目前依然遗留一个问题: 场景描述:有一个组合注解如下:
@Target({
ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@EnableFeignClients
@EnableAutoConfiguration(
excludeName = {
"org.springframework.cloud.netflix.ribbon.RibbonAutoConfiguration"}
)
public @interface EnablePigFeignClients {
String[] value() default {
};
String[] basePackages() default {
"com.pig4cloud.pig"};
Class<?>[] basePackageClasses() default {
};
Class<?>[] defaultConfiguration() default {
};
Class<?>[] clients() default {
};
}
这个组合注解所在的项目打包成一个Jar包放到maven私服中。 新创建一个项目,依赖组合注解所在的项目,这个时候@SpringCloudApplication在@EnablePigFeignClients上面的时候,组合注解中的@EnableAutoConfiguration注解不生效。依然会报错。 具体原因我搜索资料也无法明白为什么,哪位大佬能够解答,烦请评论区指点指点吧!万分感谢!
问题4: 发现报错异常:
Description: Field invoiceService in com.xxx.service.impl.xxxrequired a bean of type com.xxx.xxx that could not be found. The injection point has the following annotations: - @org.springframework.beans.factory.annotation.Autowired(required=true) Consider defining a bean of type com.xxx.xxx in your configuration.
请检查 @EnableFeignClients(basePackages = {“com.xxx.xxx”,“com.xxx.xxx.xxx”}) 中扫描的包是否齐全
