- 错误现象
- 错误原因分析
- 解决方法
一个类要切换数据源进行数据查询,所以要有两个变量
@AllArgsConstructor public class QueryImpl implements Query { @Value("${dgr.datasource}") private String einpDatabase ; private InfoDAO infoDAO; //others code
但是服务启动时报错:
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'ze04LogBLOImpl' defined in file [...]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'java.lang.String' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}错误原因分析
通过对可能出现问题的点排查,猜测可能是@Value和@AllArgsContructor的问题:
- @AllArgsConstructor ,将为类生成一个有参构造函数,其参数为所有已声明的属性;
- @Value,读取配置文件中的参数赋值给属性;
程序启动初始化Bean,创建构造函数时会把@Value修饰的变量一起加上,导致出现异常(更加底层细节需要进一步的研究)。
解决方法@RequiredArgsConstructor,也会为类生成一个构造函数,但是其参数只是final字段或者non-null字段,遂做以下修改
- 将 @AllArgsConstructor换为 @RequiredArgsConstructor
- 将除使用@Value修饰之外的的字段,使用final进行修饰
@RequiredArgsConstructor public class QueryImpl implements Query { @Value("${dgr.datasource}") private String einpDatabase ; private final InfoDAO infoDAO; //others code
即可解决以上问题。
虽然问题解决了,但是具体的底层原因还没清楚,需要进一步研究,欢迎分享。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)