错误现象
一个类要切换数据源进行数据查询,所以要有两个变量
@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
即可解决以上问题。
虽然问题解决了,但是具体的底层原因还没清楚,需要进一步研究,欢迎分享。
版权声明:本文为weixin_42002803原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。