没有符合条件的 bean,预期是单个匹配的 bean,但找到了 2 个

No qualifying bean, expected single matching bean but found 2

我在 Internet 和堆栈 overlow 上都进行了搜索,但似乎找不到解决我的问题的方法:

Unable to find bean reference for type 'class com.consol.citrus.http.client.HttpClient'Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.consol.citrus.http.client.HttpClient' available: expected single matching bean but found 2: server1BasicAuthClient,server2BasicAuthClient

简要介绍一些背景信息:我必须使用 Spring 5 和 Citrus Framework 制作一个小型应用程序来自动化我们的集成测试。

我定义如下我的豆子:

@Configuration 
public class EndpointAuthentication {

public String server1Host;

public int server1Port;

public String server2Host;

public int server2Port;

@Bean(name="server1BasicAuthClient")
public com.consol.citrus.http.client.HttpClient server1BasicAuthClient() throws Exception {
    return CitrusEndpoints.http()
            .client()
            .requestUrl(String.format("http://%s:%s/", server1Host, server1Port))
            .requestFactory(sslRequestFactory(server1Host,server1Port))
            .build();
}

@Bean(name="server2BasicAuthClient")
public com.consol.citrus.http.client.HttpClient server2BasicAuthClient() throws Exception {
    return CitrusEndpoints.http()
            .client()
            .requestUrl(String.format("http://%s:%s/", server2Host, server2Port))
            .requestFactory(sslRequestFactory(server2Host,server2Port))
            .build();
}
}

然后我尝试像这样注入我的 Bean,

public class AuthenticationIT {

@Autowired
@Qualifier("server1BasicAuthClient")
@CitrusEndpoint
private HttpClient server1BasicAuthClient;

@Autowired
@Qualifier("server2BasicAuthClient")
@CitrusEndpoint
private HttpClient server2BasicAuthClient;
....
}

关于在哪里以及如何解决问题的任何想法?

提前致谢。

如果您打算通过名称表达注释驱动的注入,请不要主要使用@Autowired,即使在技术上能够通过@Qualifier 值引用bean 名称。相反,使用 JSR-250 @Resource 注释,它在语义上定义为通过其唯一名称标识特定目标组件,声明的类型与匹配过程无关。

作为这种语义差异的特定后果,不能通过@Autowired 注入本身定义为集合或映射类型的 bean,因为类型匹配不适用于它们。对此类 bean 使用 @Resource,通过唯一名称引用特定集合或映射 bean。

@Autowired 适用于字段、构造函数和多参数方法,允许通过参数级别的限定符注释缩小范围。相比之下,@Resource 仅支持具有单个参数的字段和 bean 属性 setter 方法。因此,如果您的注入目标是构造函数或多参数方法,请坚持使用限定符。


尝试使用 value 而不是 name 或使用 @Primary

进行设置
@Bean(value="server1BasicAuthClient")
@Bean(value="server2BasicAuthClient")

Refer 1 Refer 2