自动装配地图无法按预期工作

时间:2011-02-09 09:58:37

标签: java spring ioc-container

我正在使用Spring 3.0.4。我有一些在地图上使用@Autowired注释的bean。这些映射在application-context.xml文件中定义(因为这些映射是使用多种工厂方法构建的)。

当我使用我的调试器时,我可以看到使用正确的(预期的)bean id构建映射。但是,一旦自动装配过程开始,它声称它找不到具有刚刚创建的id的bean。

一段代码:

@Autowired
@Qualifier("dienstverbandMap")
private Map<String, String> dienstverbandMap;

上下文片段xml:

<bean class="java.util.HashMap" id="dienstverbandMap" factory-bean="someFactoryMethod" factory-method="getMappedMap"/>  

重要的细节,当我在我的类和上下文xml中将类型更改为java.lang.Object时,确实有线实际上,我可以在我的代码中将它转换为HashMap并且让一切顺利。但这显然不是我想要的。

任何人都得到了解释我做错了什么?

4 个答案:

答案 0 :(得分:5)

3.11.3. Fine-tuning annotation-based autowiring with qualifiers:

引用: 如果您打算按名称表达注释驱动的注入,请不要主要使用@Autowired - 即使技术上能够通过@Qualifier值引用bean名称。相反,更喜欢JSR-250 @Resource注释,该注释在语义上定义为通过其唯一名称标识特定目标组件,声明的类型与匹配过程无关。

作为此语义差异的特定结果,无法通过@Autowired注入本身定义为集合或映射类型的bean,因为类型匹配不适用于它们。对这样的bean使用@Resource,以唯一名称引用特定的集合/映射bean。

答案 1 :(得分:4)

我认为这与dienstverbandMap的类型参数有关。如果Spring可以确定bean实例(HashMap)实际上被实例化为HashMap<String, String>,则只能安全地执行注入。 Spring可能会丢失类型参数,因为bean的声明类型是原始类型。

另一种可能性是工厂方法的结果签名是错误的;例如映射而不是HashMap,或原始HashMap而不是HashMap<String, String>

(如果你向我们展示了工厂方法的声明,那么这些理论中的一些可能会被反驳。)


顺便说一句,根据spring-beans 2.0 DTD和3.0 XSD中的注释,如果提供class属性,则不使用factory-bean属性。你试过完全把它留下来吗?

答案 2 :(得分:0)

我很确定你的工厂方法返回java.util.Map,而不是java.util.HashMap,所以我猜你可能会这样做:

<bean class="java.util.Map" id="dienstverbandMap"
      factory-bean="someFactoryMethod" factory-method="getMappedMap"/>  

免责声明:我不确定Spring是否允许您这样做,因为Map是一个界面,但值得一试。

答案 3 :(得分:0)

地图的bean定义不包含类型参数,因此自动布线无法确认其类型是否正确。

如果您使用<util:map>,您可以指定类型参数,但显然不能使用您自己的工厂方法。唯一的其他解决方案是让你的bean需要原始Map(坏)或显式连接bean定义中的地图(更好)。