java - Spring 5 - @Bean 方法的自定义限定符 - NoSuchBeanDefinitionException
问题描述
我一直在努力将自定义@Qualifier 与@Bean 结合使用而不是工厂方法。它看起来像这样:
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE,
ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface MyCustomQualifierUno {
String value() default "";
}
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE,
ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface MyCustomQualifierDos {
String value() default "";
}
所需bean的工厂类由以下两种方法组成:
@Bean
@MyCustomQualifierUno
public RestTemplate getRestTemplate(SomeConfigUno config,
SomeErrorHandlerUno errorHandler) {
return new RestTemplateBuilder()
(...)
.build();
}
@Bean
@MyCustomQualifierDos
public RestTemplate getRestTemplate(SomeConfigDos config,
SomeErrorHandlerDos errorHandler) {
return new RestTemplateBuilder()
(...)
.build();
}
接下来,在 Client 类中,我有一个 ctor 注入,如下所示:
public SomeClientUno(@SomeQualifierUno RestTemplate
restTemplate) {
this.restTemplate = restTemplate;
}
public SomeClientDos(@SomeQualifierDos RestTemplate
restTemplate) {
this.restTemplate = restTemplate;
}
当我尝试运行应用程序时,我得到: NoSuchBeanDefinitionException
非常有趣的事实是,当我添加一个扩展 RestTemplate 并将我的 @CustomQualifier 放在那里的专用类时,我得到了异常,现在实际上有两个 bean(即现在它确实考虑了 @Bean 方法)!
运行方式:IntelliJ Ultimate 2019.1 操作系统:Windows 10 64bit Java:1.8.0_191 春季版:5.1.9
PS。那些“Uno's 和 'Dos'ses 是为了强调一个事实,即这些是一些具体的类型,完全不相关,但不要与 @Qualifiers 中的“Uno's 和 'Dos'ses 混淆
解决方案
这似乎太明显了,但是为什么要使用限定符呢?假设您这样定义 bean:
@Bean
public RestTemplate restTemplateUno(...) { ... }
@Bean
public RestTemplate restTemplateDos(...) { ... }
这会使用限定符“restTemplateUno”和“restTemplateDos”注册 bean,因为“默认情况下,bean 名称将与方法名称相同”(有关详细信息,请参阅Spring 文档)。
您现在可以将它们注入客户端构造函数中,如下所示:
@Autowired
public SomeClientUno(RestTemplate restTemplateUno) {...}
@Autowired
public SomeClientDos(RestTemplate restTemplateDos) {...}
我希望这会有所帮助,并且我没有错过一些明显的事情,这些事情导致您首先考虑使用限定符。
推荐阅读
- java - 如何只允许一个活动的@Async 任务?
- npm - JHipster 为什么我需要手动启动前端?
- c# - 有没有一种方法可以简化检查值是某物的倍数而不是 0 的方法?
- java - 退出活动时如何在 Firestore 中执行 delete() 操作?
- python - 熊猫如何划分以获得不同两个数据帧的比率
- python - 使用引用模块的变量
- html - Angularjs函数在iframe中不起作用
- python - 如何实时读取 html 并循环插入到 MySQL?
- android - 如何验证 App Indexing 实施?
- c# - Microsoft.TeamFoundation.WorkItemTracking.Client.Field 添加默认值