qualifies - Spring esperaba al menos 1 bean que califique como candidato de autowire para esta dependencia
que es un bean en spring (2)
Deberías poner esta línea en el contexto de tu aplicación:
<context:component-scan base-package="com.cinebot.service" />
Tengo un problema con este Autowire:
@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 {
...
}
Me sale 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 el ThreadProvider de la clase autocableada, pero realmente necesito la clase abstracta ThreadProvider.
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 tienes decir esta estructura:
public class ThreadProvider implements CustomInterface{
...
}
Luego en tu controlador prueba esto:
@Controller
public class ChiusuraController {
@Autowired
private CustomInterface chiusuraProvider;
}
La razón por la que esto está sucediendo es que, en su primer caso, cuando no tenía ChiusuraProvider
ThreadProvider
Spring probablemente estaba subyacente creando un proxy basado en CGLIB (para manejar el @Transaction).
Cuando 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 necesita usar ChisuraProvider
, puede probar AspectJ como alternativa o forzar el proxy basado en CGLIB en el caso con ThreadProvider, también de esta manera:
<aop:aspectj-autoproxy proxy-target-class="true"/>
Aquí hay más referencias sobre esto del sitio Spring Reference: http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/classic-aop-spring.html#classic-aop -pfb