que qualifies mvc least expected example ejemplo component bean autowire anotaciones spring dependency-injection autowired

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" />

Obtenga más información sobre Detección automática de clases y registro de definiciones de beans en la documentación .

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