我在春天定义了一张地图:
<util:map id="AdditionalParams" scope="prototype" map-class="java.util.HashMap"
key-type="java.lang.String" value-type="java.lang.String">
<entry key="Start" value="12345" />
<entry key="Finish" value="12365" />
</util:map>
然后我将这个bean自动装配到一个定义为:
的属性private @Autowired @Qualifier(value = "AdditionalParams") Map<String, String> additionalParams;
执行此操作时,会抛出一个异常,说:
引起:org.springframework.beans.factory.BeanCreationException:创建名为'DutyCreator'的bean时出错:注入自动连接的依赖项失败;嵌套异常是org.springframework.beans.factory.BeanCreationException:无法自动装配字段:private java.util.Map DutyCreator.additionalParams;嵌套异常是org.springframework.beans.factory.NoSuchBeanDefinitionException:找不到匹配[java.lang.String]类型的匹配bean依赖[map with value type java.lang.String]:期望至少有一个bean有资格作为autowire候选者对于这种依赖。依赖注释:{@ org.springframework.beans.factory.annotation.Autowired(required = true),@ org.springframework.beans.factory.annotation.Qualifier(value = AdditionalParams)}
引起:org.springframework.beans.factory.NoSuchBeanDefinitionException:没有找到类型[java.lang.String]的匹配bean,用于依赖[map with value type java.lang.String]:期望至少有1个bean符合条件作为此依赖关系的autowire候选者。依赖注释:{@ org.springframework.beans.factory.annotation.Autowired(required = true),@ org.springframework.beans.factory.annotation.Qualifier(value = AdditionalParams)}
有什么想法吗?
干杯。
答案 0 :(得分:116)
从Spring 4.3开始,@Autowired
can inject lists and maps和问题中的给定代码将起作用:
也就是说,从4.3开始,只要元素类型信息保存在
@Autowired
返回类型签名中,集合/映射和数组类型也可以通过Spring的@Bean
类型匹配算法进行匹配。或集合继承层次结构。
但是使用较低的Spring版本,您无法自动装配这样的集合。但是,您可以执行以下操作:
@Resource(name="AdditionalParams")
private Map<String, String> additionalParams;
甚至:
@Value("#{AdditionalParams}")
private Map<String, String> additionalParams;
检查spring docs,提示部分:
本身定义为集合或地图类型的bean不能 通过@Autowired注入,因为类型匹配不正确 适用于他们。将@Resource用于此类bean
答案 1 :(得分:3)
好像你的 @Qualifier(value =“AdditionalParams”)无效。
尝试按照注释使用地图:
@Resource
private Properties AdditionalParams;
并保持applicationContext.xml文件不变。
答案 2 :(得分:2)
@Autowired ApplicationContext ctx;
private <T> T getBean(String qualifier, Class<T> returnType){
//use this for loop to print all bean from ctx. so you wont miss the typo.
/*for(String s:ctx.getBeanDefinitionNames())
log.info(s);*/
return ctx.getBean(qualifier, returnType);
}
//在通话中
if(providerList == null){
providerList = ctx.getBean("providerList", Map.class);
}
此解决方案对我有用