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>
¿Tienes método setter para el campo 'contactService'? – sundar
@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. –
@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 –