java - que - @Autowired-No se ha encontrado ningún bean de calificación para la dependencia
@autowired spring para que sirve (12)
¿Puedes intentar anotar solo tu implementación concreta con @Component
? Quizás la siguiente answer podría ayudar. Es un problema similar. Usualmente pongo las anotaciones de Spring en las clases de implementación.
answer
Comencé mi proyecto creando entidades, servicios y pruebas JUnit para servicios usando Spring e Hibernate. Todo esto funciona genial. Luego agregué spring-mvc para hacer esta aplicación web usando muchos tutoriales paso a paso diferentes, pero cuando intento hacer Controller con la anotación @Autowired, recibo errores de Glassfish durante la implementación. Supongo que, por alguna razón, Spring no ve mis servicios, pero después de muchos intentos todavía no puedo manejarlos.
Pruebas para servicios con
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:/beans.xml"})
y
@Autowired
MailManager mailManager;
trabaja apropiadamente.
Controladores sin @Autowired también, puedo abrir mi proyecto en el navegador web sin problemas.
/src/main/resources/beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd
http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_2_0.xsd">
<context:property-placeholder location="jdbc.properties" />
<context:component-scan base-package="pl.com.radzikowski.webmail">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<!--<context:component-scan base-package="pl.com.radzikowski.webmail.service" />-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<!-- Persistance Unit Manager for persistance options managing -->
<bean id="persistenceUnitManager" class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager">
<property name="defaultDataSource" ref="dataSource"/>
</bean>
<!-- Entity Manager Factory for creating/updating DB schema based on persistence files and entity classes -->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitManager" ref="persistenceUnitManager"/>
<property name="persistenceUnitName" value="WebMailPU"/>
</bean>
<!-- Hibernate Session Factory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!--<property name="schemaUpdate" value="true" />-->
<property name="packagesToScan" value="pl.com.radzikowski.webmail.domain" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
</props>
</property>
</bean>
<!-- Hibernate Transaction Manager -->
<bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- Activates annotation based transaction management -->
<tx:annotation-driven transaction-manager="txManager"/>
</beans>
/webapp/WEB-INF/web.xml
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="WebApp_ID" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Spring Web MVC Application</display-name>
<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
/webapp/WEB-INF/mvc-dispatcher-servlet.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<context:component-scan base-package="pl.com.radzikowski.webmail" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<mvc:annotation-driven/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
pl.com.radzikowski.webmail.service.AbstractManager
package pl.com.radzikowski.webmail.service;
import org.apache.log4j.Logger;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
/**
* Master Manager class providing basic fields for services.
* @author Maciej Radzikowski <[email protected]>
*/
public class AbstractManager {
@Autowired
protected SessionFactory sessionFactory;
protected final Logger logger = Logger.getLogger(this.getClass());
}
pl.com.radzikowski.webmail.service.MailManager
package pl.com.radzikowski.webmail.service;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
@Component
@Transactional
public class MailManager extends AbstractManager {
// some methods...
}
pl.com.radzikowski.webmail.HomeController
package pl.com.radzikowski.webmail.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import pl.com.radzikowski.webmail.service.MailManager;
@Controller
@RequestMapping("/")
public class HomeController {
@Autowired
public MailManager mailManager;
@RequestMapping(value = "/", method = RequestMethod.GET)
public String homepage(ModelMap model) {
return "homepage";
}
}
Error:
SEVERE: Exception while loading the app
SEVERE: Undeployment failed for context /WebMail
SEVERE: Exception while loading the app : java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: org.springframework.beans.factory.BeanCreationException: Error creating bean with name ''homeController'': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: public pl.com.radzikowski.webmail.service.MailManager pl.com.radzikowski.webmail.controller.HomeController.mailManager; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [pl.com.radzikowski.webmail.service.MailManager] 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)}
Perdón por un montón de código, pero ya no sé qué puede causar ese error.
Adicional
He creado la interfaz:
@Component
public interface IMailManager {
implementos añadidos:
@Component
@Transactional
public class MailManager extends AbstractManager implements IMailManager {
y cambiado autoencendido:
@Autowired
public IMailManager mailManager;
Pero todavía arroja errores (también cuando he intentado con @Qualifier)
..No se puede autoconectar el campo: public pl.com.radzikowski.webmail.service.IMailManager pl.com.radzikowski.webmail.controller.HomeController.mailManager ...
Lo he intentado con diferentes combinaciones de @Component y @Transactional también.
¿No debería incluir beans.xml en web.xml de alguna manera?
Corrí a esto recientemente, y resultó que importé la anotación incorrecta en mi clase de servicio. Netbeans tiene una opción para ocultar las declaraciones de importación, es por eso que no lo vi por un tiempo.
He usado @org.jvnet.hk2.annotations.Service
lugar de @org.springframework.stereotype.Service
.
Debe conectar automáticamente la interfaz de AbstractManager
lugar de la clase MailManager
. Si tiene implemetaciones diferentes de AbstractManager
, puede escribir @Component("mailService")
y luego la @Autowired @Qualifier("mailService")
para autoaumentar la clase específica.
Esto se debe al hecho de que Spring crea y usa objetos proxy basados en las interfaces.
El hecho es que tanto el contexto de la aplicación como el contexto de la aplicación web se registran en WebApplicationContext durante el inicio del servidor. Cuando ejecuta la prueba, debe indicar explícitamente qué contextos cargar.
Prueba esto:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:/beans.xml", "/mvc-dispatcher-servlet.xml"})
Esto puede ayudarte:
Tengo la misma excepción en mi proyecto. Después de buscar, encontré que me falta la anotación @Service a la clase donde estoy implementando la interfaz que quiero @Autowired.
En su código, puede agregar la anotación @Service a la clase MailManager.
@Transactional
@Serivce
public class MailManager extends AbstractManager implements IMailManager {
Esto sucedió porque mis pruebas no estaban en el mismo paquete que mis componentes. ( @ComponentScan
nombre de mi paquete de componentes, pero no mi paquete de prueba.) Y estaba usando @ComponentScan
en mi clase @Configuration
prueba, por lo que mis pruebas no encontraban los componentes en los que confiaban.
Por lo tanto, comprueba que si obtienes este error.
La forma correcta será autoaumentar AbstractManager, como sugirió Max, pero esto debería funcionar bien también.
@Autowired
@Qualifier(value="mailService")
public MailManager mailManager;
y
@Component("mailService")
@Transactional
public class MailManager extends AbstractManager {
}
Pasé gran parte de mi tiempo con esto! ¡Mi error! Más tarde descubrí que la clase en la que declaraba el Service
o Component
anotación era de tipo abstracto. Había habilitado los registros de depuración en Springframework pero no se recibió ninguna sugerencia. Por favor, compruebe si la clase es de tipo abstracto. Si entonces, la regla básica aplicada, no puede instanciar una clase abstracta.
Si está probando su controlador. No olvides usar @WebAppConfiguration en tu clase de prueba.
Yo creo que aquí
<context:component-scan base-package="pl.com.radzikowski.webmail" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>
todas las anotaciones se deshabilitan primero por use-default-filters = "false" y luego solo se activa la anotación @Controller. Por lo tanto, su anotación @Component no está habilitada.
<context:component-scan base-package="com.*" />
llegó el mismo problema, lo resolví manteniendo las anotaciones intactas y en el servlet despachador :: manteniendo el escaneo del paquete base como com.*.
esto funcionó para mí.
- Una razón por la cual BeanB puede no existir en el contexto
- Otra causa de la excepción es la existencia de dos frijoles
- O las definiciones en el contexto bean que no está definido se solicitan por nombre desde el contexto de Spring
ver más esta url:
http://www.baeldung.com/spring-nosuchbeandefinitionexception