我有一个Spring地图问题让我流泪。
我的春天看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd
">
<util:map id="mockMap">
<entry key="userTest1" value="test1"/>
<entry key="userTest2" value="test2"/>
<entry key="userTest3" value="test6"/>
</util:map>
</beans>
然后我自动连接的代码如下(省略了相关部分):
@Autowired
@Resource(name="mockMap")
Map<String, String> testMap;
@Test
public void testGetGearListActivityOK() {
for (String key : testMap.keySet()) {
System.out.println("key = " + key);
}
}
令人惊讶的是,这实际上会在自动装配步骤中给出一个错误,说明没有匹配类型String的bean。但是,如果我将单元测试中的地图更改为Map,那么我得到以下输出:
[junit] key = mockMap [junit] key = org.springframework.context.annotation.internalConfigurationAnnotationProcessor [junit] key = org.springframework.context.annotation.internalAutowiredAnnotationProcessor [junit] key = org.springframework.context.annotation.internalRequiredAnnotationProcessor [junit] key = org.springframework.context.annotation.internalCommonAnnotationProcessor [junit] key = systemProperties [junit] key = systemEnvironment [junit] key = messageSource [junit] key = applicationEventMulticaster [junit] key = lifecycleProcessor
我还没有能够将条目的关键部分显示为实际显示为关键字。如果我将地图更改回Map并将一些地图添加到我的春天,那么地图将填充这些地图,使用他们的ID作为键。
我在这里很困惑,并且在过去使用了春天相当的数量。如果有人知道这里到底发生了什么,我将非常感激。
提前致谢。
另外,我看到了这个问题:Auto-wiring a List using util schema gives NoSuchBeanDefinitionException
但是解决方案是使用@Resource,我已经在做了..
答案 0 :(得分:25)
删除@Autowired并仅使用@Resource(name =“mockMap”)
答案 1 :(得分:1)
你无法自动装配这样的集合。
但是,你可以试试这些:
@Resource(name="mockMap")
private Map<String, String> testMap;
甚至:
@Value("#{mockMap}")
private Map<String, String> testMap;
检查spring docs,提示部分:
本身定义为集合或地图类型的bean不能 通过@Autowired注入,因为类型匹配不正确 适用于他们。将@Resource用于此类bean
答案 2 :(得分:0)
只使用@Resource并在配置中将“testMap”更改为“mockMap”