Continuo a ricevere questo errore, e non riesco a capire perché .. sì, so che molte persone hanno avuto problemi simili, ma leggendo le risposte che hanno ottenuto, non risolve il mio problema.Impossibile eseguire il campo autowire in primavera. perché?
org.springframework.beans.factory.BeanCreationException: errore durante la creazione di bean con nome 'contactController': Iniezione di dipendenze autowired non riuscita; l'eccezione annidata è org.springframework.beans.factory.BeanCreationException: non è possibile eseguire il campo autowire: private net.service.ContactService net.controller.ContactController.contactService; l'eccezione annidata è org.springframework.beans.factory.NoSuchBeanDefinitionException: Nessun bean corrispondente di tipo [net.service.ContactService] trovato per dipendenza: atteso almeno 1 bean che si qualifica come candidato autowire per questa dipendenza. annotazioni Dipendenza: {@ org.springframework.beans.factory.annotation.Autowired (richiesto = true)}
qui è il controller:
@Controller
@SessionAttributes
public class ContactController {
@Autowired
private ContactService contactService;
//methods...
}
il 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();
}
}
the ContactDaoplpl
@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();
}
}
e 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>
così hai il metodo setter per il campo 'contactService'? – sundar
@sundar non è necessario un metodo setter per quel campo in modo che l'iniezione a molla funzioni. Ad ogni modo, il problema qui è chiaramente il fatto che il bean da iniettare non è stato trovato fino a quanto sa Spring, non che sia stato trovato ma non è in grado di iniettarlo. –
@DaveNewton: doh, hai ragione, ho scritto una lunga risposta di fantasia che non lo menziona affatto. Sì, se il pacchetto che contiene ContactServiceImpl non è tra quelli dichiarati come annotabili-scansionabili, il bean non verrà creato e quindi non sarà disponibile per l'iniezione in altri bean –