Spring无法自动装配Map bean

时间:2012-12-17 11:58:56

标签: java spring map

我在春天定义了一张地图:

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

有什么想法吗?

干杯。

3 个答案:

答案 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);
 }

此解决方案对我有用