使用spring / JSR-330注入地图时出错

时间:2013-04-29 21:59:10

标签: spring dependency-injection jsr330

我有2个maven项目,一个web-app和一个'service'项目。我用弹簧将所有东西连在一起。我想在application-context.xml中创建一个映射,并将其注入到我的类中。当我尝试启动我的Web应用程序时,收到错误消息。

这是我的班级:

 @Named("tranformer")
 public class IdentifierTransformerImpl implements IdentifierTransformer {


private Map<String, String> identifierMap;

@Inject
public IdentifierTransformerImpl(
        @Named("identifierMap")
        final Map<String, String> identifierMap) {
            this.identifierMap= identifierMap;
}

和application-context.xml:

    xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="
    http://www.springframework.org/schema/util
    http://www.springframework.org/schema/util/spring-util-3.0.xsd"

  <util:map id="identifierMap" map-class="java.util.HashMap">
    <entry key="Apple" value="fruit"/>
    <entry key="BlackBerry" value="fruit"/>
    <entry key="Android" value="robot"/>
   <util:map>

  <context:component-scan base-package="com.example" />

我收到以下错误:

 ..... No matching bean of type [java.lang.String] found for dependency [map with value type java.lang.String]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@javax.inject.Named(value=identifierMap)

当我在我的应用程序上下文中定义一个字符串,并且构造函数将它注入一个类时,这是有效的,我如何为一个地图做同样的事情?

3 个答案:

答案 0 :(得分:2)

我认为@Inject或@Autowired注释不支持Map集合(请参阅:Spring can't autowire Map bean)。但是我设法通过将该注释作为该答案建议的资源进行注释来自动装配Map。试试这个:

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

缺点是当然不是构造函数自动装配,而是一个领域。我还没有找到通过构造函数自动装配的方法

答案 1 :(得分:0)

如果这是您的xml文件的直接复制/粘贴,则不会结束<util:map>标记。你错过了第二个/

答案 2 :(得分:-1)

使用构造函数注入。

@Inject
public IdentifierTransformerImpl(
    @Value(value = "#{identifierMap}")
    final Map<String, String> identifierMap) {
        this.identifierMap= identifierMap;
}

不理想,但Spring拒绝提供更好的选择。

https://jira.spring.io/browse/SPR-8519

查看更多详情