2012-08-14 20 views
25

Sigo recibiendo este error, y no puedo entender por qué ... sí, sé que muchas personas tenían problemas similares, pero leer las respuestas que obtuvieron no resuelve mi problema.No se pudo autoconectar el campo en primavera. ¿por qué?

org.springframework.beans.factory.BeanCreationException: Error al crear bean con el nombre 'contactController': Falló la inyección de dependencias de autocableado; la excepción anidada es org.springframework.beans.factory.BeanCreationException: no se pudo autoconectar el campo: private net.service.ContactService net.controller.ContactController.contactService; la excepción anidada es org.springframework.beans.factory.NoSuchBeanDefinitionException: no se ha encontrado ningún bean de tipo [net.service.ContactService] para la dependencia: se espera al menos 1 bean que califique como candidato de autowire para esta dependencia. anotaciones Dependencia: {@ org.springframework.beans.factory.annotation.Autowired (requiere = true)}

aquí es el controlador:

@Controller 
@SessionAttributes 
public class ContactController { 

    @Autowired 
    private ContactService contactService; 
//methods... 


} 

la ContactServiceImpl

@Service("contactService") 
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true) 
public class ContactServiceImpl implements ContactService { 

    @Autowired 
    private ContactDao contactDao; 

    public ContactServiceImpl() { 
    } 

    @Override 
    @Transactional(propagation = Propagation.REQUIRED, readOnly = false) 
    public void addContact(Contact contact) { 
     contactDao.saveContact(contact); 
    } 

    @Override 
    public List<Contact> getContacts() { 
     return contactDao.getAllContacts(); 
    } 

} 

Contact ContactImpl

@Repository("contactDao") 
public class ContactDaoImpl implements ContactDao { 

    @Autowired 
    private SessionFactory sessionFactory; 

    @Override 
    public void saveContact(Contact contact) { 
     sessionFactory.getCurrentSession().saveOrUpdate(contact); 
    } 

    @Override 
    @SuppressWarnings("unchecked") 
    public List<Contact> getAllContacts() { 
     return (List<Contact>) sessionFactory.getCurrentSession().createQuery("from contact c").list(); 
    } 

} 

y la primavera-servlet.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:context="http://www.springframework.org/schema/context" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    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/tx 
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> 

    <context:property-placeholder location="classpath:jdbc.properties" /> 
    <context:component-scan base-package="net.controller" /> 


    <tx:annotation-driven transaction-manager="hibernateTransactionManager" /> 

    <bean id="viewResolver" 
     class="org.springframework.web.servlet.view.UrlBasedViewResolver"> 
     <property name="viewClass" 
      value="org.springframework.web.servlet.view.JstlView" /> 
     <property name="prefix" value="/WEB-INF/jsp/" /> 
     <property name="suffix" value=".jsp" /> 
    </bean> 

    <bean id="dataSource" 
     class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="${database.driver}" /> 
     <property name="url" value="${database.url}" /> 
     <property name="username" value="${database.user}" /> 
     <property name="password" value="${database.password}" /> 
    </bean> 

    <bean id="sessionFactory" 
     class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="annotatedClasses"> 
      <list> 
       <value>net.form.Contact</value> 
      </list> 
     </property> 


     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">${hibernate.dialect}</prop> 
       <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> 
      </props> 
     </property> 
    </bean> 

    <bean id="hibernateTransactionManager" 
     class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="sessionFactory" /> 
    </bean> 
</beans> 
+0

¿Tienes método setter para el campo 'contactService'? – sundar

+0

@sundar no necesita un método setter para ese campo para que la inyección Spring funcione. En cualquier caso, el problema aquí es claramente el hecho de que el frijol que se inyecta no se encuentra hasta donde lo sabe Spring, no porque se haya encontrado, pero no puede inyectarlo. –

+1

@DaveNewton: doh, tienes razón, escribí una larga y elegante respuesta que no menciona eso en absoluto. Sí, si el paquete que contiene ContactServiceImpl no está entre los declarados como anotación-escaneable, el bean no se creará y, por lo tanto, no estará disponible para su inyección en otros beans –

Respuesta

33

En .xml servlet primavera:

<context:component-scan base-package="net.controller" /> 

(I supone que el impl servicio está en el mismo paquete que la interfaz "net.service" servicio)

Yo creo que hay que añadir el net.service paquete (o la totalidad de la red) para la exploración componente . Actualmente, la primavera solo busca en net.controller para componentes y como su servicio impl está en net.service, no se creará una instancia para la primavera.

+0

sí, esa fue una gran idea.

+0

He guardado erróneamente el serivice en otro paquete, Funcionó muy bien. Gracias. –

8

Bueno, hay un problema con la creación del frijol ContactServiceImpl. En primer lugar, asegúrese de que la clase se instancia realmente mediante la depuración del constructor no-args cuando se inicia el contexto Spring y cuando se crea una instancia de ContactController.

Si el ContactServiceImpl en realidad está instanciado por el contexto Spring, pero simplemente no coincide con su anotación @Autowire, intente ser más explícito en su inyección de anotación. Aquí hay un tipo tratando con un problema similar como el suyo y dar algunas soluciones posibles:

http://blogs.sourceallies.com/2011/08/spring-injection-with-resource-and-autowired/

Si me preguntas, creo que todo irá bien si sustituye

@Autowired 
private ContactService contactService; 

con:

@Resource 
@Qualifier("contactService") 
private ContactService contactService; 
9

Estaba recibiendo el mismo error y lo busqué aquí. Mi solución parecía ser simplemente agregar la anotación @Component a la implementación del servicio abstracto.

En este caso, que se vería así:

import org.springframework.stereotype.Component; 

... 

@Component 
public class ContactServiceImpl implements ContactService { 
0

que tenía exactamente el mismo problema tratar de poner las dos clases en el mismo paquete y añadir la línea en el pom.xml

<dependency> 
      <groupId> org.springframework.boot </groupId> 
      <artifactId> spring-boot-starter-web </artifactId> 
      <version> 1.2.0.RELEASE </version> 
</dependency> 
5

Cuando recibe este error, falta una anotación. Me faltaba la anotación @service en el servicio. Cuando agregué esa anotación funcionó bien para mí.

0

En config java, asegúrese de que tiene importar su configuración en RootConfig como esto @Import (PersistenceJPAConfig.class)

1

hoy me he enfrentado a la misma cuestión. Resultó ser que olvidé mencionar la anotación de @ Service/@ Component para mi archivo de implementación del servicio, para el cual la primavera no puede conectarse automáticamente y no crear el bean.

Cuestiones relacionadas