2012-12-17 8 views
51

ich eine Karte im Frühjahr als solche definiert haben:Frühling kann nicht autowire Karte Bohne

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

Und dann bin autowiring ich diese Bohne auf eine Eigenschaft wie folgt definiert:

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

Wenn dies zu tun, die eine der Ausnahme sagen, dass geworfen bekommen:

verursacht durch: org.springframework.beans.factory.BeanCreationException: Fehler Bohne Erstellung mit dem Namen ‚DutyCreator‘: Inje ction von autowired Abhängigkeiten fehlgeschlagen; verschachtelte Ausnahme ist org.springframework.beans.factory.BeanCreationException: Feld konnte nicht autowire: private java.util.Map DutyCreator.additionalParams; verschachtelte Ausnahme ist org.springframework.beans.factory.NoSuchBeanDefinitionException: Keine übereinstimmende Bean vom Typ [java.lang.String] gefunden für Abhängigkeit [map mit Werttyp java.lang.String]: erwartete mindestens 1 Bean, die sich als Autowire-Kandidat qualifiziert für diese Abhängigkeit. Dependency Anmerkungen: {@ org.springframework.beans.factory.annotation.Autowired (required = true), @ org.springframework.beans.factory.annotation.Qualifier (Wert = AdditionalParams)}

Verursacht durch: org.springframework .beans.factory.NoSuchBeanDefinitionException: Keine übereinstimmende Bean vom Typ [java.lang.String] für Abhängigkeit gefunden [map mit Werttyp java.lang.String]: erwartet mindestens eine Bean, die sich als Autowire-Kandidat für diese Abhängigkeit qualifiziert. Dependency Anmerkungen: {@ org.springframework.beans.factory.annotation.Autowired (required = true), @ org.springframework.beans.factory.annotation.Qualifier (Wert = AdditionalParams)}

Irgendwelche Ideen?

Prost.

+0

Sie bitte Ihre Anwendung Context-Datei teilen. – Amber

+0

Sie können auch die '' XML-Konfiguration – Alex

Antwort

108

Beginnend mit Frühlings-4.3, @Autowiredcan inject lists and maps und der gegebenen Code in der Frage funktionieren würde:

Das heißt, ab 4.3, Sammlung/Karte und Array-Typen als @Autowired Typ-Matching-Algorithmus Frühling werden kann abgestimmt durch Nun, solange die Informationen zum Elementtyp in @Bean Rückgabetypen-Signaturen oder Sammlungsvererbungshierarchien beibehalten werden.

Aber mit einer niedrigeren Spring-Version, können Sie eine Sammlung nicht so autowire. Allerdings können Sie wie folgt vorgehen:

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

oder sogar:

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

Überprüfen Sie die spring docs, die Spitzen Abschnitt:

Bohnen, die sich als eine Sammlung oder den Kartentyp definiert can not durch @Autowired injiziert werden, da die Typübereinstimmung nicht korrekt ist für sie anwendbar. Verwenden Sie @Resource für solche Bohnen

+1

perfekt verwenden. genau das, was ich gesucht habe .. Danke. das funktionierte für mich .. @Resource (name = "AdditionalParams") –

+0

Danke, das war sehr unintuitiv; Ich weiß jetzt mehr über 'map' und' util: map' als ich wollte: -/ –

+0

Wow, ich habe schon Stunden mit diesem Problem verbracht. Warum Spring nur Autowire statt Resource verwenden? Auf diese Weise macht Spring einfach so nervig zu bedienen. –

2

Scheint, wie Ihr @Qualifier (value = "AdditionalParams") funktioniert nicht.

Probieren Sie die Karte durch folgende Anmerkung mit:

@Resource 
private Properties AdditionalParams; 

und Ihre applicationContext.xml Datei intakt zu halten.

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

// in Ihrem Anruf

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

Diese Lösung funktioniert gut zu mir

Verwandte Themen