我注意到
@Qualifier
注释不适用于 final
成员变量。
在下面的代码中,
Vehicle
的Person
成员变量声明为final
,则抛出异常;vehicle
为空)。谁能解释一下为什么?
// 2 Vehicle beans are annotated by @Qualifier;
@Configuration
public class Config
{
@Bean
@Qualifier("vehicle1")
Vehicle vehicle1() {
var veh = new Vehicle();
veh.setName("Benz");
return veh;
}
@Bean
@Qualifier("vehicle2")
Vehicle vehicle2() {
var veh = new Vehicle();
veh.setName("BMW");
return veh;
}
}
// Person has a final member variable Vehicle
@Component
@Data
public class Person
{
private String name="Mike";
@Qualifier("vehicle2")
private final Vehicle vehicle;
}
Springboot 抱怨 NoUniqueBeanDefinitionException:
- 没有可用的“project1.Vehicle”类型的合格 bean:预期 单个匹配 bean 但找到 2:vehicle1,vehicle2
问题与lombok密切相关,比较普遍
如果您使用的是 IntelliJ,请转到项目构建目录以打开类文件。
处理后的类为:
@Component
public class Person {
private String name = "Mike";
@Qualifier("vehicle2")
private final Vehicle vehicle;
public Person(final Vehicle vehicle) {
this.vehicle = vehicle;
}
...
}
我们看到本例中是通过构造函数注入的,
@Qualifier
被忽略了。因此,我们将看到NoUniqueBeanDefinitionException
,因为我们没有指定要使用哪个bean。
这次处理的类是:
@Component
public class Person {
private String name = "Mike";
@Qualifier("vehicle2")
private Vehicle vehicle;
public Person() {
}
...
}
vehicle
这次没有出现在构造函数中,`vehicle没有@Autowired
,所以没有执行注入,它是空的。
首先,
@Data
与Spring bean一起使用并不常见,@Data
通常被DTO使用。为了支持构造函数注入,我将像下面这样修改Person
@Component
public class Person {
private String name = "Mike";
private final Vehicle vehicle;
public Person(@Qualifier("vehicle2") Vehicle vehicle) {
this.vehicle = vehicle;
}
// ... getter setter omitted
}