可以使用Spring创建HashMap但不能创建Map

时间:2012-12-19 09:13:13

标签: spring

我可以在带有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(值=地图)}

我的问题是:为什么我无法使用界面自动连接我的地图?

感谢。

2 个答案:

答案 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中的提示