2011-02-09 19 views
8

我使用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"/> 

重要的细节,当我改变类型java.lang.Object中在我的课和上下文XML它既确实有线事实上,我可以将其转换为我的代码中的HashMap,并让所有的东西都能正常工作。但那不是我想要的。

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

回答

4

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

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

(其中的一些理论可以推翻,如果你向我们展示了工厂方法的声明。)


顺便提一下,根据弹簧豆2.0 DTD和3.0 XSD的意见,如果您提供factory-bean属性,则不会使用class属性。你有没有试过完全放弃它?

+1

你说得对。我的工厂方法签名返回Map <>,当我将其更改为HashMap时,所有内容都开始工作。谢谢!! :) – 2011-02-09 10:51:23

+0

我想,工厂实现了一个强制返回类型为Map(或更具体)的接口。然而,即使这样也行不通。我必须改变界面才能使这个工作。 Yuk :) – 2011-02-09 12:28:56

0

我敢肯定,你的工厂方法返回java.util.Map,不java.util.HashMap,所以我想你也许可以做到这一点:

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

免责声明:我不知道春天会让你做,因为Map是一个界面,但值得一试。

+0

我试着将bean类型设置为java.util.Map。但无济于事。尽管感谢您的建议。 – 2011-02-09 10:27:17

5

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

报价: 如果要表达的名字注解驱动的注入,不主要使用@Autowired - 即使是在技术上能够通过@Qualifier值指的是bean的名字。相反,更喜欢JSR-250 @Resource注释,它的语义定义是通过其唯一名称来标识特定的目标组件,而声明的类型与匹配过程无关。

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

0

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

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