2012-12-17 25 views
51

ho definito una mappa in primavera in quanto tale:Primavera non può autowire Mappa di fagioli

<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> 

E poi sto autowiring questo fagiolo per una proprietà definita come:

private @Autowired @Qualifier(value = "AdditionalParams") Map<String, String> additionalParams; 

Quando In questo modo, l'un'eccezione ottenere gettato dicendo che:

causato da: org.springframework.beans.factory.BeanCreationException: Errore durante la creazione di fagioli con nome 'DutyCreator': Inje ction delle dipendenze autowired fallito; l'eccezione annidata è org.springframework.beans.factory.BeanCreationException: Impossibile eseguire il campo autowire: private java.util.Map DutyCreator.additionalParams; l'eccezione annidata è org.springframework.beans.factory.NoSuchBeanDefinitionException: nessun bean corrispondente di tipo [java.lang.String] trovato per dipendenza [mappa con tipo di valore java.lang.String]: atteso almeno 1 bean che si qualifica come candidato autowire per questa dipendenza. Annotazioni sulle dipendenze: {@ org.springframework.beans.factory.annotation.Autowired (required = true), @ org.springframework.beans.factory.annotation.Qualifier (value = AdditionalParams)}

causato da: org.springframework .beans.factory.NoSuchBeanDefinitionException: nessun bean corrispondente di tipo [java.lang.String] trovato per dipendenza [map con valore type java.lang.String]: previsto almeno 1 bean che si qualifica come candidato autowire per questa dipendenza. annotazioni Dipendenza: {@ org.springframework.beans.factory.annotation.Autowired (richiesto = true), @ org.springframework.beans.factory.annotation.Qualifier (valore = AdditionalParams)}

Tutte le idee?

Cheers.

+0

Si prega di condividere il file contesto di applicazione. – Amber

+0

È anche possibile utilizzare la '' configurazione xml – Alex

risposta

108

A partire dalla primavera 4.3, @Autowiredcan inject lists and maps e il codice riportato nella domanda avrebbe funzionato:

Detto questo, come di 4,3, la raccolta/mappa e tipi di array possono essere abbinati tramite algoritmo di matching @Autowired tipo di primavera come beh, a patto che le informazioni sul tipo di elemento siano conservate in @Bean firme dei tipi di ritorno o gerarchie di ereditarietà delle raccolte.

Ma con una versione Spring inferiore, non è possibile creare una raccolta come quella. Tuttavia, è possibile effettuare le seguenti operazioni:

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

o anche:

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

Controllare il spring docs, la sezione di punte:

fagioli che sono essi stessi definito come un tipo di raccolta o una mappa non è possibile iniettare tramite @Autowired, perché la corrispondenza del tipo non è correttamente applicabile a . Utilizzare @Resource per tali fagioli

+1

perfetta. esattamente quello che stavo cercando .. Grazie. questo ha funzionato per me .. @Resource (name = "AdditionalParams") –

+0

Grazie, questo era molto intuitivo; Ora so di più su 'map' e' util: map' di quanto volessi: -/ –

+0

Wow, ho già passato ore su questo problema. Perché Spring usa solo autowire al posto di Resource? In questo modo, rendi Spring così fastidioso da usare. –

2

sembra come il vostro @Qualifier (value = "AdditionalParams") non funziona.

Prova utilizzando la mappa dal seguente annotazione:

@Resource 
private Properties AdditionalParams; 

e mantenendo intatto il file applicationContext.xml.

1
@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); 
} 

// all'interno della vostra chiamata

if(providerList == null){ 
     providerList = ctx.getBean("providerList", Map.class); 
} 

questa soluzione funziona bene per me

Problemi correlati