我可以在带有Spring(3.0.5)的applicationContext中执行此操作:
<bean id="map" class="java.util.HashMap" scope="prototype" >
<constructor-arg>
<map key-type="java.lang.String" value-type="java.lang.String">
<entry key="Key 1" value="1" />
<entry key="Key 2" value="2" />
</map>
</constructor-arg>
</bean>
在我的控制器中,我可以像这样自动装配我的地图:
@Autowired
@Qualifier("map")
private HashMap<String, String> map;
它工作正常,但如果我这样做:
@Autowired
@Qualifier("map")
private Map<String, String> map;
我明白了:
引起: org.springframework.beans.factory.NoSuchBeanDefinitionException:没有 为依赖[map]找到匹配的类型为[java.lang.String]的bean 值类型为java.lang.String]:预计至少有1个bean 有资格作为此依赖项的autowire候选者。依赖 注释: {@ org.springframework.beans.factory.annotation.Autowired(所需=真), @ org.springframework.beans.factory.annotation.Qualifier(值=地图)}
我的问题是:为什么我无法使用界面自动连接我的地图?
感谢。
答案 0 :(得分:36)
在声明类型集合的bean时,无法通过@Autowired注入它。请参阅以下Spring的文档:
4.11.3 Fine-tuning annotation-based autowiring with qualifiers
作为这种语义差异的具体结果,豆类是 自己定义为集合或地图类型不能通过注入 @Autowired,因为类型匹配不适用于它们。使用 @Resource用于此类bean,指的是特定的集合/映射 bean以唯一的名字命名。
因此,使用@Autowired
:
@Resource
@Resource
@Qualifier("map")
private Map<String, String> map;
答案 1 :(得分:11)
尝试使用@Resource
代替@Autowired
@Resource(name="map")
private HashMap<String, String> map;
查看Spring文档的3.9.3 Fine-tuning annotation-based autowiring with qualifiers中的提示