我有一个似乎是一个简单的问题,正如标题中所述。这是我的课程类别:
public class Foo {
@Autowired
public Foo(@Qualifier("bar") Set<String> bar) {
// ...
}
}
我尝试使用以下弹簧上下文运行:
<context:annotation-config />
<util:set id="bar">
<value>tata</value>
<value>titi</value>
<value>toto</value>
</util:set>
<bean id="foo" class="Foo" />
无法运行:
没有匹配类型的bean 找到[java.lang.String] 依赖[收集 java.lang.String]:预计至少为1 豆有资格作为autowire 这种依赖的候选人。 依赖注释: {@ org.springframework.beans.factory.annotation.Qualifier(值=巴)}
请注意,如果我将其他参数添加到构造函数中,它可以正常工作。如果我使用setter注入,它工作正常。我确定我会错过一些明显的东西......你知道吗?
答案 0 :(得分:22)
使用@Autowired
注释无法自动装配集合。自动装配的集合意味着“提供特定类型的所有bean”。使用JSR-250 @Resource
注释,您可以声明您希望按名称注入资源,而不是其类型。或者您明确注入依赖项。
[...]自身定义为集合或地图类型的bean无法通过
@Autowired
注入,因为类型匹配不适用于它们。对这样的bean使用@Resource
,以唯一名称引用特定的集合/映射bean。
有关详细信息,请参阅the Spring documentation。
答案 1 :(得分:5)
正如其他人所说,不可能将@Autowired用于字符串和字符串集合。假设你在版本3中有弹簧,你可以在这里使用带弹簧EL的@Value:
public class Foo { @Autowired public Foo(@Value("#{bar}") Set<String> bar) { // ... } }
答案 2 :(得分:2)
我认为这是因为Spring将集合的自动装配解释为“给我所有类型String
的bean”,而不是“给我作为{的集合的bean” {1}}”。错误消息支持这个想法。
我认为你不能使用自动装配。如果没有在XML中手动连接它,我建议的最好的是:
String
答案 3 :(得分:2)
我遇到了同样的问题,并受到@rembisz's answer的启发。这个答案对我的Spring版本(4.1.3)没有影响。当我检查SpEL documentation on bean references时,我发现了一种不同的SpEL语法来表达对我有用的自动装配值中的bean引用 - @beanname
。因此,以下代码对我有用:
public class Foo {
@Autowired
public Foo(@Value("#{@bar}") Set<String> bar) {
// ...
}
}