没有符合条件的 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")
我在 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")