2010-01-28 7 views
6

Tengo un ServiceListFactoryBean que crea una lista de implementaciones de servicios:Cómo Autowire factorybean

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

que pueden acceder a los servicios utilizando el applicationContext sin ningún problema:

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

También puedo usar trad constructor-arg inyección con éxito:

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

Pero si trato de autoautar el depend rencia

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

cuando me siento un BeanCreationException causada por

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

estoy usando Spring 3.0.

Respuesta

10

Resulta que la respuesta es ...

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

Esto funcionará, porque ahora se está autocableando por nombre, en lugar de por tipo. Ese fue el caso anteriormente. Puede ser que hayas eliminado el problema esta vez. Pero debes entender por qué. Por lo tanto, reflexione sobre la respuesta provista. Aclamaciones. –

+0

Vinagre: solo hay dos beans en todo el proyecto (hasta el momento) e independientemente de que se utilicen @Qualifiers o no, o que indiquen de forma explícita el autoarranque predeterminado a byType o byName, @Autowiring no funciona para este ServiceListFactoryBean. –

4

El mensaje de excepción es de DefaultListableBeanFactory, y se complining que no puede Autowire su campo porque el List tiene ningún tipo genérico (véase la línea de DefaultListableBeanFactory 716).

Intente agregar una firma genérica a su campo, e.h.

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

Sí, lo clavaste. +1 –

+2

No, esto no funciona, me temo. Establezca explícitamente autowire a byType y obtenga: No se ha encontrado un bean de tipo [ServiceInterface] para la dependencia [colección de ServiceInterface] –

0

lo que en realidad encontramos hoy en día, es que cuando se necesita asignar nombres de frijol a instancias de interfaz específica, no hay necesidad de @Qualifier 's y cualquier tipo de FactoryBean código. Spring encontraría e inyectaría candidatos para ti. @Resource no hizo su trabajo, por las dudas.

Cuestiones relacionadas