2012-07-04 16 views
17

Tengo un problema con este Autowire:primavera se espera al menos 1 frijol, que califica como Autowire candidato para esta dependencia

@Controller 
public class ChiusuraController { 

    @Autowired 
    private ChiusuraProvider chiusuraProvider; 
} 

con este frijol:

@Service @Transactional 
public class ChiusuraProvider extends ThreadProvider { 


    public void run() {} 
} 

que se extiende

public abstract class ThreadProvider extends Thread implements InitializingBean, Runnable, DisposableBean { 
... 
} 

Recibo este error:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'chiusuraController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.cinebot.service.ChiusuraProvider com.cinebot.web.controller.ChiusuraController.chiusuraProvider; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [com.cinebot.service.ChiusuraProvider] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 

Vi que no obtuve este error si elimino y extiendo ThreadProvider de clase autocableada, pero realmente necesito la clase abstracta ThreadProvider.

Respuesta

19

Si hay una interfaz en cualquier lugar de la jerarquía ThreadProvider intente poner el nombre de la interfaz como el tipo de su proveedor de servicios, por ej. si usted tiene decir que esta estructura:

public class ThreadProvider implements CustomInterface{ 
... 
} 

Luego, en su controlador intente esto:

@Controller 
public class ChiusuraController { 

    @Autowired 
    private CustomInterface chiusuraProvider; 
} 

La razón por la que esto está sucediendo es, en su primer caso en el que no tenían ChiusuraProvider extender ThreadProvider primavera, probablemente, estaba subyacente creando un proxy basado en CGLIB para usted (para manejar el @Transaction).

Cuando se extendió desde ThreadProvider suponiendo que ThreadProvider extiende alguna interfaz, Spring en ese caso crea un Proxy basado en Java Dynamic Proxy, que parecería ser una implementación de esa interfaz en lugar de ser del tipo ChisuraProvider.

Si es absolutamente necesario utilizar ChisuraProvider puede probar AspectJ como alternativa o forzar proxy basado en CGLIB en el caso de ThreadProvider también de esta manera:

<aop:aspectj-autoproxy proxy-target-class="true"/> 

Aquí hay más referencia sobre esto desde la referencia de la primavera sitio: http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/classic-aop-spring.html#classic-aop-pfb

+0

¿Qué sucede si mi clase implementa una interfaz múltiple? – user1050619

+0

Espera ... simplemente me salvaste la vida. Utilicé la versión de anotación @EnableAspectJAutoProxy (proxyTargetClass = true). ¡Gracias! –

7

Usted debe poner esta línea en su contexto de aplicación:

<context:component-scan base-package="com.cinebot.service" /> 

Read more about Automatically detecting classes and registering bean definitions in documentation.

+0

Agregué esta línea donde ChiusuraProvider está incluido en el paquete com.cinebot.service y ThreadProvider NO está incluido en ese paquete ... pero no funciona. – Tobia

+0

¿Intentó la respuesta de @BijuKunjummen (utilizando el proxy con ámbito AOP, recuerde agregar la dependencia CGLIB)? – Xaerxess

Cuestiones relacionadas