2010-01-28 12 views
6

Mam ServiceListFactoryBean który tworzy listę wdrożeń usługę:Jak autowire factorybean

<bean id="services" 
     class="org.springframework.beans...ServiceListFactoryBean" 
     p:serviceType="ServiceInterface"/> 

mogę uzyskać dostęp do usług za pomocą ApplicationContext bez problemu:

final List services = ctx.getBean("services", List.class)); 

mogę również wykorzystać trad Wstrzykiwanie konstruktora-arg z powodzeniem:

<bean id="aClass" class="AClass"> 
    <constructor-arg ref="services"/> 
</bean> 

Ale jeśli spróbuję wyposażyć użytkownika w funkcję zależną Ency

@Autowired @Qualifier("services") private List services; 

Potem dostaję BeanCreationException spowodowane

FatalBeanException: No element type declared for collection [java.util.List] 

Używam Wiosna 3.0.

Odpowiedz

10

Okazuje się, że odpowiedź jest ...

@Resource(name="services") private List services; 
+1

To rzeczywiście zadziała, ponieważ teraz jest automatycznie nagrywane według nazwy, a nie według typu. Tak było wcześniej. Być może tym razem powaliłeś problem. Ale musisz zrozumieć dlaczego. Zastanów się więc nad odpowiedzią. Twoje zdrowie. –

+0

Ocet - W całym projekcie są tylko dwa komponenty (do tej pory) i bez względu na to, czy używają @Qualifiers, czy też nie, lub jawnie ustawiasz domyślny-autowire na byType lub byName, @Autowiring nie działa dla tego ServiceListFactoryBean. –

4

Komunikat Wyjątkiem jest od DefaultListableBeanFactory, i to complining że nie może autowire swoje pole, ponieważ List ma typ rodzajowy (patrz DefaultListableBeanFactory linię 716).

Spróbuj dodać ogólny podpis do swojego pola, e.h.

@Autowired @Qualifier("services") private List<Service> services; 
+0

Tak, przygwoździliście to. +1 –

+2

Nie, to nie działa Obawiam się. Jawnie ustaw autowire na byType i otrzymaj: Nie znaleziono pasującej fasoli typu [ServiceInterface] dla zależności [kolekcja ServiceInterface] –

0

co faktycznie okazało się, dzisiaj jest to, że kiedy trzeba map nazw Bean wystąpień określonego interfejsu, nie ma potrzeby @Qualifier „s, a każdy rodzaj kodu FactoryBean. Wiosna znajdzie i wstrzyknie kandydatów dla ciebie. @Resource nie zrobił tego, na wszelki wypadek.

Powiązane problemy