Spring不能autowire Map bean

spring我定义了一张地图:

<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> 

然后我自动assembly这个bean到一个属性定义如下:

 private @Autowired @Qualifier(value = "AdditionalParams") Map<String, String> additionalParams; 

当这样做,一个例外得到抛出,说:

引起:org.springframework.beans.factory.BeanCreationException:创build名为'DutyCreator'的bean时出错:注入自动装载依赖失败; 嵌套的exception是org.springframework.beans.factory.BeanCreationException:不能自动assembly字段:private java.util.Map DutyCreator.additionalParams; 嵌套的exception是org.springframework.beans.factory.NoSuchBeanDefinitionException:找不到匹配[java.lang.String]types的依赖的bean [值types为java.lang.String的映射]:期望至less有1个符合自动assembly候选的bean对于这个依赖。 依赖注释:{@ org.springframework.beans.factory.annotation.Autowired(required = true),@ org.springframework.beans.factory.annotation.Qualifier(value = AdditionalParams)}

引起:org.springframework.beans.factory.NoSuchBeanDefinitionException:找不到匹配[java.lang.String]types的依赖的bean [值types为java.lang.String的映射]:期望至less1个符合自动assembly候选的bean对于这个依赖。 依赖注释:{@ org.springframework.beans.factory.annotation.Autowired(required = true),@ org.springframework.beans.factory.annotation.Qualifier(value = AdditionalParams)}

有任何想法吗?

干杯。

从Spring 4.3开始,@ @Autowired 可以注入列表和映射 ,问题中的给定代码将工作:

也就是说,只要元素types信息保存在@Bean返回types签名或集合inheritance层次结构中,就可以通过Spring的@Autowiredtypes匹配algorithm来匹配集合/映射和数组types。

但是如果使用较低的Spring版本,则不能自动装载这样的集合。 但是,您可以执行以下操作:

 @Resource(name="AdditionalParams") private Map<String, String> additionalParams; 

甚至:

 @Value("#{AdditionalParams}") private Map<String, String> additionalParams; 

检查春季文档 ,提示部分:

自身定义为集合或映射types的bean不能通过@Autowired注入,因为types匹配不适用于它们。 使用@Resource这样的bean

看起来像你的@Qualifier(值=“AdditionalParams”)不起作用。

尝试通过以下注释使用地图:

 @Resource private Properties AdditionalParams; 

并保持您的applicationContext.xml文件不变。

 @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); } 

这个解决scheme对我很好