没有 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 还有两个稍微好一点的选择:

  1. 如果您的 class 是 Spring-aware,请注入 RestTemplateBuilder 而不是 RestTemplate,并将其用于您的自定义。这允许应用程序级别的配置(例如,添加身份验证和跟踪拦截器),然后在特定服务级别(转换器、故障处理程序)上进一步配置。

  2. 使用 @Bean 配置您的 AClassUsingRestTemplate,将 RestTemplate 传递给其构造函数。 (建议使用构造函数注入而不是字段注入。)在 @Bean 中,您可以进行任何自定义设置。