2010-07-29 11 views
20

Ho quello che sembra essere un problema semplice, come indicato nel titolo. Ecco il tipo di classe che ho:Autowiring una raccolta tramite il costruttore con Spring

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

cui cerco di correre con il seguente contesto primavera:

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

Questo non riesce a correre con:

Nessuna corrispondenza di fagioli di digitare [java.lang.String] trovato per dipendenza [raccolta di java.lang.String]: previsto almeno 1 bean che si qualifica come autowire candidato per questa dipendenza. Dipendenza annotazioni: {@ org.springframework.beans.factory.annotation.Qualifier (value = bar)}

Si noti che se aggiungo altri parametri al mio costruttore, funziona benissimo. Se uso l'iniezione setter, funziona bene. Sono sicuro che mi manca qualcosa di ovvio ... sai cosa?

risposta

22

collezioni autowiring non è possibile utilizzare il @Autowired annotazione. Una collezione autowired significa "fornire tutti i bean di un tipo particolare". Usando l'annotazione JSR-250 @Resource, puoi dichiarare che vuoi una risorsa iniettata dal suo nome, non dal suo tipo. O si inietta la dipendenza in modo esplicito.

[...] fagioli esse stesse definiti come una raccolta o un tipo di mappa non può essere iniettato attraverso @Autowired dal tipo di corrispondenza non è propriamente loro applicabile. Utilizzare @Resource per tali bean, facendo riferimento alla raccolta/al bean mappa specifico per nome univoco.

Vedere the Spring documentation per ulteriori dettagli.

2

ho che questo è perché la primavera interpreta l'autowiring di una collezione come "dammi tutti i fagioli di tipo String", piuttosto che "dammi il fagiolo, che è una raccolta di String". Il messaggio di errore supporta quell'idea.

Non penso che sia possibile utilizzare l'autowiring per questo. A corto di cablaggio manualmente nella XML, il meglio che posso suggerire è:

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

Come altri hanno dichiarato, è impossibile utilizzare @Autowired per Stringhe e raccolte di String. È possibile utilizzare @Value con molla EL qui a patto di avere la primavera nella versione 3:

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

Ho avuto questo stesso problema ed è stato ispirato da @rembisz's answer. Questa risposta non ha funzionato sulla mia versione di Spring (4.1.3). Quando ho controllato il SpEL documentation on bean references, ho trovato una sintassi SPEL diversa per esprimere riferimenti a bean nei valori autowired che hanno funzionato per me - @beanname. Come tale, il codice seguente ha funzionato per me:

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