2012-12-19 12 views
25

mogę to zrobić w moim ApplicationContext z wiosny (3.0.5):można utworzyć HashMap z wiosny, ale nie mogą tworzyć Mapa

<bean id="map" class="java.util.HashMap" scope="prototype" > 
    <constructor-arg> 
     <map key-type="java.lang.String" value-type="java.lang.String"> 
      <entry key="Key 1" value="1" /> 
      <entry key="Key 2" value="2" /> 
     </map> 
    </constructor-arg> 
</bean> 

I w moim kontrolera, mogę autowired moją mapę tak:

@Autowired 
@Qualifier("map") 
private HashMap<String, String> map; 

to działa dobrze, ale jeśli mogę to zrobić:

@Autowired 
@Qualifier("map") 
private Map<String, String> map; 

otrzymuję że:

spowodowane przez: org.springframework.beans.factory.NoSuchBeanDefinitionException: Nie dopasowanie fasoli typu [java.lang.String] znaleziono zależność [mapy z rodzaju Wartość java.lang.String] Oczekuje się co najmniej 1 komponent bean, który kwalifikuje się jako kandydat na autora dla tej zależności. Zależnościami adnotacje: {@ org.springframework.beans.factory.annotation.Autowired (wymagane = true), @ org.springframework.beans.factory.annotation.Qualifier (wartość = map)}

My Pytanie brzmi: Dlaczego nie mogę automaredować mojej mapy za pomocą interfejsu, kiedy mogę z implementacją?

Dzięki.

+1

nie mają id fasolowa z mapy, to jest mylące – NimChimpsky

+1

prawdziwym problemem jest: mapa nie powinna być w ogóle fasola wiosna w pierwsze miejsce. usługi powinny być fasolą, dane nie powinny. Jeśli naprawdę chcesz utworzyć komponent bean mapy, utwórz komponent bean, który zawiera mapę i wstrzyknij. –

+0

@SeanPatrickFloyd, dlaczego nie można wstrzyknąć niczego i uzyskać korzyści. Nie ma żadnych negatywnych efektów? (zakładając, że nadałeś mu opisową nazwę) – NimChimpsky

Odpowiedz

35

Podczas deklarowania fasoli typu kolekcji, nie można wstrzyknąć go poprzez @Autowired. Zobacz poniżej dokumentacji od wiosny:

4.11.3 Fine-tuning annotation-based autowiring with qualifiers

Jako specyficzny konsekwencji tej semantycznej różnicy, fasola, które są sami zdefiniowany jako zbiór lub typu mapa nie może być wstrzykiwany przez @Autowired od typu dopasowania nie jest właściwie dla nich stosowane. Użyj @Resource dla takich ziaren, odnosząc się do fasoli kolekcji/mapy według unikalnej nazwy.

Zatem zamiast @Autowired użyć @Resource:

@Resource 
@Qualifier("map") 
private Map<String, String> map; 
+1

Ale nie mogę użyć @Resource na parametry konstruktora. Potrzebuję tego za pośrednictwem konstruktora – Harish

Powiązane problemy