我同时在互联网和堆栈上搜索过低,但似乎找不到解决问题的方法:
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;
....
}
有什么想法在哪里以及如何解决此问题?
提前谢谢。
答案 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")