Spring kann Map-Beans nicht automatisch verdrahten

Lesezeit: 3 Minuten

Benutzer-Avatar
Nick

Ich habe eine Karte im Frühjahr wie folgt definiert:

<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 verdrahte ich diese Bean automatisch mit einer Eigenschaft, die wie folgt definiert ist:

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

Dabei wird eine Ausnahme ausgelöst, die besagt:

Verursacht durch: org.springframework.beans.factory.BeanCreationException: Fehler beim Erstellen einer Bean mit dem Namen ‘DutyCreator’: Injektion von automatisch verdrahteten Abhängigkeiten fehlgeschlagen; verschachtelte Ausnahme ist org.springframework.beans.factory.BeanCreationException: Feld konnte nicht automatisch verdrahtet werden: private java.util.Map DutyCreator.additionalParams; Die verschachtelte Ausnahme ist org.springframework.beans.factory.NoSuchBeanDefinitionException: Keine übereinstimmende Bean des Typs [java.lang.String] für Abhängigkeit gefunden [map with value type java.lang.String]: Mindestens 1 Bean erwartet, die sich als Autowire-Kandidat für diese Abhängigkeit qualifiziert. Abhängigkeitsanmerkungen: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=AdditionalParams)}

Verursacht durch: org.springframework.beans.factory.NoSuchBeanDefinitionException: Keine passende Bean des Typs [java.lang.String] für Abhängigkeit gefunden [map with value type java.lang.String]: Mindestens 1 Bean erwartet, die sich als Autowire-Kandidat für diese Abhängigkeit qualifiziert. Abhängigkeitsanmerkungen: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=AdditionalParams)}

Irgendwelche Ideen?

Prost.

  • Bitte teilen Sie die Kontextdatei Ihrer Anwendung.

    – Bernstein

    17. Dezember 2012 um 12:11 Uhr

  • Sie können auch die verwenden <util:map> xml-Konfiguration

    – Alex

    17. Dezember 2012 um 12:20 Uhr

Benutzer-Avatar
garst

Beginnend mit Spring 4.3, @Autowired kann Listen und Karten einspritzen und der angegebene Code in der Frage würde funktionieren:

Ab Version 4.3 können Sammlungs- / Karten- und Array-Typen jedoch über Spring’s abgeglichen werden @Autowired Typ-Matching-Algorithmus, solange die Elementtypinformationen erhalten bleiben @Bean Rückgabetypsignaturen oder Auflistungsvererbungshierarchien.

Aber mit einer niedrigeren Spring-Version können Sie eine solche Sammlung nicht automatisch verdrahten. Sie können jedoch Folgendes tun:

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

oder auch:

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

Überprüf den Frühlingsdokumenteder Tipps-Bereich:

Beans, die selbst als Sammlungs- oder Zuordnungstyp definiert sind, können nicht über @Autowired injiziert werden, da der Typabgleich nicht richtig auf sie anwendbar ist. Verwenden Sie @Resource für solche Beans

  • perfekt. genau das, wonach ich gesucht habe. Danke. das hat bei mir funktioniert. @Resource(name=”AdditionalParams”)

    – Robin Bajaj

    28. Februar 2013 um 21:57 Uhr


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

    – Cory Kendall

    5. Juli 2013 um 21:22 Uhr

  • Wow, ich habe schon Stunden mit diesem Problem verbracht. Warum verwendet Spring einfach Autowire anstelle von Resource? Auf diese Weise wird Spring einfach so nervig.

    – Evan Hu

    18. Januar 2015 um 16:57 Uhr

  • Für diejenigen, denen dies immer noch nicht hilft, vergessen Sie nicht, @Qualifier(name=”AdditionalParams”) zu entfernen, sonst funktioniert es nicht.

    – hipokito

    10. Juli 2016 um 17:40 Uhr

  • Hat jemand ein vollständiges Arbeitsbeispiel für @Autowired? Funktioniert bei mir immer noch nicht.

    – Markus Barthlen

    15. November 2018 um 9:37 Uhr

Scheint bei dir zu sein @Qualifier(value = “ZusätzlicheParams”) funktioniert nicht.

Versuchen Sie, die Karte mit folgender Anmerkung zu verwenden:

@Resource
private Properties AdditionalParams;

und halten Sie Ihre Datei applicationContext.xml intakt.

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

// innerhalb Ihres Anrufs

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

Diese Lösung funktioniert gut für mich

1055690cookie-checkSpring kann Map-Beans nicht automatisch verdrahten

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy