没有合格的Bean,应该是单个匹配的Bean,但是找到了2

时间:2019-03-15 12:32:25

标签: java spring-boot citrus-framework

我同时在互联网和堆栈上搜索过低,但似乎找不到解决问题的方法:

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创建一个小型应用程序以自动化我们的集成测试。

我定义为遵循我的Bean:

@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;
....

}

有什么想法在哪里以及如何解决此问题?

提前谢谢。

1 个答案:

答案 0 :(得分:1)

如果您打算按名称表示注释驱动的注入,则即使技术上可以通过@Qualifier值引用bean名称,也不要主要使用@Autowired。相反,请使用JSR-250 @Resource批注,该批注的语义定义是通过其唯一名称来标识特定目标组件,而声明的类型与匹配过程无关。

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

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


尝试使用value而不是name进行设置,或者使用@Primaray

@Bean(value="server1BasicAuthClient")
@Bean(value="server2BasicAuthClient")

Refer 1 Refer 2