2012-12-17 10 views
51

mam zdefiniowaną mapę wiosną takie jak:Wiosna nie może autowire Mapa fasoli

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

A potem ja autowiring to Bean właściwości zdefiniowane jako:

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

Kiedy Czyniąc to, wyjątek get rzucony mówiąc, że:

Spowodowany przez: org.springframework.beans.factory.BeanCreationException: błąd podczas tworzenia bean z nazwą 'DutyCreator': Inje nie powiodło się uzależnienie od auteniowanych zależności; Zagnieżdżony wyjątek to org.springframework.beans.factory.BeanCreationException: Nie można wyposażyć pola: private java.util.Map DutyCreator.additionalParams; Zagnieżdżony wyjątek to org.springframework.beans.factory.NoSuchBeanDefinitionException: Brak pasującej fasoli typu [java.lang.String] znalezionej dla zależności [mapa z typem wartości java.lang.String]: oczekiwany co najmniej 1 komponent bean, który kwalifikuje się jako kandydat na autora dla tej zależności. Adnotacje zależności: {@ org.springframework.beans.factory.annotation.Auccessred (required = true), @ org.springframework.beans.factory.annotation.Qualifier (value = AdditionalParams)}

Spowodowane przez: org.springframework .beans.factory.NoSuchBeanDefinitionException: Nie znaleziono pasującej fasoli typu [java.lang.String] dla zależności [mapa z typem wartości java.lang.String]: oczekiwano co najmniej 1 komponentu bean, który kwalifikuje się jako kandydat na agenta dla tej zależności. adnotacje zależnościami: {@ org.springframework.beans.factory.annotation.Autowired (wymagane = true), @ org.springframework.beans.factory.annotation.Qualifier (wartość = AdditionalParams)}

Jakieś pomysły?

Pozdrawiam.

+0

Proszę podzielić plik kontekstu aplikacji. – Amber

+0

Możesz również użyć konfiguracji '' 'xml perfect – Alex

Odpowiedz

108

Począwszy od wiosny 4.3 @Autowiredcan inject lists and maps i dany kod w pytaniu będzie działać:

Powiedział, że jako 4,3, gromadzenia/map i typy tablic mogą być dopasowane przez @Autowired typu algorytm dopasowywania Wiosna jako no, tak długo, jak informacja o typie elementu jest zachowywana w @Bean sygnaturach typów zwracanych lub hierarchiach dziedziczenia kolekcji.

Jednak w wersji o niższej wersji sprężyny nie można przeprowadzić takiego tworzenia kolekcji. Można jednak wykonać następujące czynności:

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

lub nawet:

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

sprawdzić spring docs sekcja porad:

fasola, które same są zdefiniowane jako typ kolekcji lub mapy nie można wstrzykiwać przez @Autowired, ponieważ dopasowanie typu nie jest prawidłowe mające zastosowanie do nich. Użyj @Resource takich ziaren

+1

perfect. dokładnie to, czego szukałem .. Dzięki. to zadziałało dla mnie .. @Resource (name = "AdditionalParams") –

+0

Dzięki, to było bardzo nieintuicyjne; Teraz wiem więcej o 'map' i' util: map' niż chciałem: -/ –

+0

Wow, już spędziłem wiele godzin na ten problem. Dlaczego Spring używa tylko autowire zamiast Resource? W ten sposób spraw, aby wiosna była tak denerwująca. –

2

Wygląda na swojej @Qualifier (value = "AdditionalParams") nie działa.

Spróbuj użyć mapę przez dopiskiem:

@Resource 
private Properties AdditionalParams; 

i utrzymywanie plik applicationContext.xml nienaruszone.

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

// wewnątrz zaproszenia

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

to rozwiązanie działa dobrze dla mnie

Powiązane problemy