58

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

<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:无法自动装配字段:私有 java.util.Map DutyCreator.additionalParams;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException:没有为依赖项 [map with value type java.lang.String] 找到类型为 [java.lang.String] 的匹配 bean:预计至少有 1 个符合自动装配候选资格的 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] 的匹配 bean [值类型为 java.lang.String 的映射]:预计至少有 1 个符合自动装配候选资格的 bean对于这种依赖。依赖注解:{@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=AdditionalParams)}

有任何想法吗?

干杯。

4

3 回答 3

119

从 Spring 4.3 开始,@Autowired 可以注入列表和地图,并且问题中的给定代码可以工作:

也就是说,从 4.3 开始,@Autowired只要元素类型信息保留在@Bean返回类型签名或集合继承层次结构中,集合/映射和数组类型也可以通过 Spring 的类型匹配算法进行匹配。

但是对于较低的 Spring 版本,您无法自动装配这样的集合。但是,您可以执行以下操作:

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

甚至:

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

检查spring 文档,提示部分:

本身定义为集合或映射类型的 bean 不能通过 @Autowired 注入,因为类型匹配不适用于它们。对此类 bean 使用 @Resource

于 2012-12-17T12:19:35.463 回答
3

似乎您的@Qualifier(value = "AdditionalParams")不起作用。

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

@Resource
private Properties AdditionalParams;

并保持您的 applicationContext.xml 文件完好无损。

于 2012-12-17T12:21:29.117 回答
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);
 }

这个解决方案对我很好

于 2014-10-10T01:22:57.820 回答