ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

记fallbackFactory引用到远程接口中报错java.lang.IllegalStateException: No fallbackFactory instance of type class

2022-01-18 21:32:58  阅读:228  来源: 互联网

标签:lang fallbackFactory spring 扫描 bean 报错 注解 factories class


这个问题放了好久都没有管,今天解决了记录一下(本来以为是什么很深奥的bug,结果发现是自己太菜了)

Caused by: java.lang.IllegalStateException: No fallbackFactory instance of type class com.*.*.*.api.factory.RemoteFallbackFactory found for feign client remoteService

目前项目使用的是SpringCloud,module配置是两个无启动类的module作为公共模块,一个API做为所有module的远程接口模块,还有一个common作为配置以及基础工具模块

之前自己公司项目的FeignClient都是在启动类同目录下,所以在启动类加一个@EnableFeignClients注解,添加个扫描包就行,而且没有配置过fallbackFactory,所以从来没有接触过这种问题。

实际上这种问题的出现,确实就是spring没有扫描到这个bean,虽然已经加了@Component注解,但是由于是跟启动类不同module,所以这个类扫描不到。

那么问题来了,springboot怎么样去扫描组件呢?

查看@SpringBootApplication的源码可以看到

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
      @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
  ...
}

其中@ComponentScan这个注解是扫描@SpringBootApplication所在包下的所有@Component注解标记的bean,并注册到Spring容器中。这里源码就省略了,基本就是类加载器加载了class文件,然后扫描其中是否有注解。

那如果想要注册的bean不在包扫描路径下怎么办?

(1)在主类上使用@Import注解(本次不做解释)

(2)使用spring.factories

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.*.*.*.api.factory.RemoteUserFallbackFactory,\
  com.*.*.*.api.factory.RemoteLogFallbackFactory

spring.factories文件是帮助spring-boot项目包以外的bean(即在pom文件中添加依赖中的bean)注册到spring-boot项目的spring容器。由于@ComponentScan注解只能扫描spring-boot项目包内的bean并注册到spring容器中,因此需要@EnableAutoConfiguration注解来注册项目包外的bean。而spring.factories文件,则是用来记录项目包外需要注册的bean类名。

 

具体参考:

spring.factories 的妙用

SpringBoot中spring.factories文件的作用

标签:lang,fallbackFactory,spring,扫描,bean,报错,注解,factories,class
来源: https://www.cnblogs.com/Frank-Z/p/15818033.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有