代码之家  ›  专栏  ›  技术社区  ›  Guillaume

通过带Spring的构造函数自动连接集合

  •  21
  • Guillaume  · 技术社区  · 14 年前

    我有一个似乎很简单的问题,如标题所述。以下是我的课程类型:

    public class Foo {
        @Autowired
        public Foo(@Qualifier("bar") Set<String> bar) {
            // ...
        }
    }
    

    我尝试使用以下spring上下文运行:

    <context:annotation-config />
    <util:set id="bar">
        <value>tata</value>
        <value>titi</value>
        <value>toto</value>
    </util:set>
    <bean id="foo" class="Foo" />
    

    找到的[java.lang.String] 依赖关系[集合] java.lang.String]:至少应为1 此依赖项的候选项。 依赖项批注:

    请注意,如果我将其他参数添加到构造函数中,它就可以正常工作。如果我用塞特注射,效果很好。我肯定我错过了一些明显的东西。。。你知道吗?

    4 回复  |  直到 14 年前
        1
  •  23
  •   Christian Semrau Louis Wasserman    14 年前

    无法使用自动关联集合 @Autowired 注释。autowired集合意味着“提供特定类型的所有bean”。使用JSR-250 @Resource 注释,您可以声明您希望按名称而不是类型注入资源。或者显式地注入依赖项。

    @自动连线 因为类型匹配不适用于它们。使用 @资源 对于此类bean,通过唯一名称引用特定的集合/映射bean。

    the Spring documentation 更多细节。

        2
  •  5
  •   mrembisz    14 年前

    public class Foo {
        @Autowired
        public Foo(@Value("#{bar}") Set<String> bar) {
            // ...
        }
    }
    
        3
  •  2
  •   skaffman    14 年前

    认为 String ,而不是“给我一个 字符串 ". 错误消息支持这个想法。

    我认为你不能用自动布线来做这个。除了在XML中手动连接外,我能建议的最好方法是:

    public class Foo {  
       private @Resource Set<String> bar;
    }
    
        4
  •  2
  •   Community CDub    7 年前

    我也有同样的问题,我的灵感来自 @rembisz's answer SpEL documentation on bean references ,我发现了一种不同的SpEL语法来用autowired值来表示bean引用,这对我很有用- @beanname . 因此,以下代码适用于我:

    public class Foo {
        @Autowired
        public Foo(@Value("#{@bar}") Set<String> bar) {
            // ...
        }
    }