没有 2 个外部 Maven 依赖项类型的合格 bean
No qualifying bean of type for 2 external maven dependencies
我正在开发一个包含 2 个 Maven 依赖项的 Spring 引导项目,这些依赖项都使用 org.springframework.web.client.RestTemplate
所以在我的项目中我会这样做:
@Autowired
AClassUsingRestTemplate object;
它触发:
No qualifying bean of type 'org.springframework.web.client.RestTemplate' available: expected single matching bean but found 2: externalDependencyOneRestTemplate,externalDependencyTwoRestTemplate
我只能控制其中一个依赖项,我在其中定义了:
@Bean(name = "externalDependencyOneRestTemplate")
public RestTemplate buildExternalDependencyOneRestTemplate() {
final HttpComponentsClientHttpRequestFactory clientHttpRequestFactory =
new HttpComponentsClientHttpRequestFactory(HttpClientBuilder.create().build());
final RestTemplate restTemplate = new RestTemplate(clientHttpRequestFactory);
restTemplate.setRequestFactory(new BufferingClientHttpRequestFactory(restTemplate.getRequestFactory()));
return restTemplate;
}
我该如何解决?
我必须告诉 ClassUsingRestTemplate
使用特定的 RestTemplate
实现吗?如果是,该怎么做?
谢谢
使用 @Qualifier
:
指定您想要的
@Autowired
@Qualifier("externalDependencyOneRestTemplate")
RestTemplate restTemplate;
如果不能根据RestTemplate
修改代码,可以指定默认哪个,即如果@Qualifier
不指定则使用哪个:
@Primary
@Bean(name = "externalDependencyOneRestTemplate")
public RestTemplate buildExternalDependencyOneRestTemplate() {
...
}
Spring 发现了 2 种类型的 beans 可以注入到这个 Autowired 成员中:“externalDependencyOneRestTemplate”
或“externalDependencyTwoRestTemplate”。
Spring 无法选择,因为它不会读懂你的想法。您必须通过使用 Qualifier 注释指定您想要的 bean 来帮助 Spring:
@Autowired
@Qualifier("nameOfMyBeanHere")
AClassUsingRestTemplate object;
此外,看起来您的 RestTemplate 实现没有做任何特别的事情,我建议启用 Spring 自动配置(它会自动创建一个 RestTemplate bean)并注入它而不是创建您自己的。
除了 Andreas 提到的 @Qualifier
方法之外,Boot 还有两个稍微好一点的选择:
如果您的 class 是 Spring-aware,请注入 RestTemplateBuilder
而不是 RestTemplate
,并将其用于您的自定义。这允许应用程序级别的配置(例如,添加身份验证和跟踪拦截器),然后在特定服务级别(转换器、故障处理程序)上进一步配置。
使用 @Bean
配置您的 AClassUsingRestTemplate
,将 RestTemplate
传递给其构造函数。 (建议使用构造函数注入而不是字段注入。)在 @Bean
中,您可以进行任何自定义设置。
我正在开发一个包含 2 个 Maven 依赖项的 Spring 引导项目,这些依赖项都使用 org.springframework.web.client.RestTemplate
所以在我的项目中我会这样做:
@Autowired
AClassUsingRestTemplate object;
它触发:
No qualifying bean of type 'org.springframework.web.client.RestTemplate' available: expected single matching bean but found 2: externalDependencyOneRestTemplate,externalDependencyTwoRestTemplate
我只能控制其中一个依赖项,我在其中定义了:
@Bean(name = "externalDependencyOneRestTemplate")
public RestTemplate buildExternalDependencyOneRestTemplate() {
final HttpComponentsClientHttpRequestFactory clientHttpRequestFactory =
new HttpComponentsClientHttpRequestFactory(HttpClientBuilder.create().build());
final RestTemplate restTemplate = new RestTemplate(clientHttpRequestFactory);
restTemplate.setRequestFactory(new BufferingClientHttpRequestFactory(restTemplate.getRequestFactory()));
return restTemplate;
}
我该如何解决?
我必须告诉 ClassUsingRestTemplate
使用特定的 RestTemplate
实现吗?如果是,该怎么做?
谢谢
使用 @Qualifier
:
@Autowired
@Qualifier("externalDependencyOneRestTemplate")
RestTemplate restTemplate;
如果不能根据RestTemplate
修改代码,可以指定默认哪个,即如果@Qualifier
不指定则使用哪个:
@Primary
@Bean(name = "externalDependencyOneRestTemplate")
public RestTemplate buildExternalDependencyOneRestTemplate() {
...
}
Spring 发现了 2 种类型的 beans 可以注入到这个 Autowired 成员中:“externalDependencyOneRestTemplate” 或“externalDependencyTwoRestTemplate”。
Spring 无法选择,因为它不会读懂你的想法。您必须通过使用 Qualifier 注释指定您想要的 bean 来帮助 Spring:
@Autowired
@Qualifier("nameOfMyBeanHere")
AClassUsingRestTemplate object;
此外,看起来您的 RestTemplate 实现没有做任何特别的事情,我建议启用 Spring 自动配置(它会自动创建一个 RestTemplate bean)并注入它而不是创建您自己的。
除了 Andreas 提到的 @Qualifier
方法之外,Boot 还有两个稍微好一点的选择:
如果您的 class 是 Spring-aware,请注入
RestTemplateBuilder
而不是RestTemplate
,并将其用于您的自定义。这允许应用程序级别的配置(例如,添加身份验证和跟踪拦截器),然后在特定服务级别(转换器、故障处理程序)上进一步配置。使用
@Bean
配置您的AClassUsingRestTemplate
,将RestTemplate
传递给其构造函数。 (建议使用构造函数注入而不是字段注入。)在@Bean
中,您可以进行任何自定义设置。