2010-07-29 11 views
20

Ich habe, was scheint ein einfaches Problem, wie im Titel angegeben. Hier ist die Art der Klasse I haben:Autowiring eine Sammlung über den Konstruktor mit Spring

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

Was ich versuche, mit folgenden Frühjahr Kontext auszuführen:

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

Dies irgendwie laufen:

keine passende Bohne Typ [java.lang.String] gefunden für Abhängigkeit [Sammlung von java.lang.String]: erwartet mindestens 1 Bohne, die sich als Autowire qualifiziert Kandidat für diese Abhängigkeit. Abhängigkeit Anmerkungen: {@ org.springframework.beans.factory.annotation.Qualifier (Wert = bar)}

Beachten Sie, dass, wenn ich andere Parameter zu meinem Konstruktor hinzufügen, es funktioniert gut. Wenn ich Setter-Injektion verwende, funktioniert es gut. Ich bin mir sicher, ich vermisse etwas offensichtlich ... Weißt du was?

Antwort

22

autowiring Sammlungen sind nicht möglich, die @Autowired Anmerkung verwenden. Eine Autowired-Sammlung bedeutet "alle Bohnen eines bestimmten Typs bereitzustellen". Mit der Annotation JSR-250 @Resource können Sie angeben, dass eine Ressource nach ihrem Namen und nicht nach ihrem Typ injiziert werden soll. Oder Sie injizieren die Abhängigkeit explizit.

[...] Bohnen, die sich als eine Sammlung oder den Kartentyp definiert sind, können nicht über @Autowired injiziert werden, da Typabgleichs ihnen nicht richtig anwendbar ist. Verwenden Sie für solche Beans @Resource und verweisen Sie dabei auf die spezifische Sammlung/Map-Bean nach dem eindeutigen Namen.

Weitere Details finden Sie unter the Spring documentation.

2

ich denke ist dies, weil Frühling den autowiring einer Sammlung wie „Gib mir alle Bohnen vom Typ String“ interpretiert, sondern als „gib mir die Bohne, die eine Sammlung von String ist“. Die Fehlermeldung unterstützt diese Idee.

Ich denke nicht, dass Sie für diese autowiring verwenden können. Kurz die Verdrahtung manuell in der XML-up, das Beste, was ich vorschlagen kann, ist:

public class Foo { 
    private @Resource Set<String> bar; 
} 
5

Wie andere sagten, ist es unmöglich, @Autowired für Strings und Sammlungen von String zu verwenden. Sie können @Value mit Feder verwenden EL hier Sie Frühjahr unter der Annahme haben in Version 3:

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

Ich hatte das gleiche Problem und wurde von @rembisz's answer inspiriert. Diese Antwort funktionierte bei meiner Version von Spring (4.1.3) nicht. Als ich die SpEL documentation on bean references überprüfte, fand ich eine andere SpEL-Syntax, um Bohnenreferenzen in den autowired Werten auszudrücken, die für mich arbeiteten - @beanname. Als solcher funktionierte der folgende Code für mich:

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