我一直在收到這個錯誤,不知道爲什麼。是的,我知道有很多人有類似的問題,但閱讀他們得到的答案,並不能解決我的問題。春天無法自動裝配字段。爲什麼?
org.springframework.beans.factory.BeanCreationException:創建名爲'contactController'的bean時出錯:注入自動裝配依賴項失敗;嵌套異常是org.springframework.beans.factory.BeanCreationException:無法自動裝入字段:private net.service.ContactService net.controller.ContactController.contactService;嵌套的異常是org.springframework.beans.factory.NoSuchBeanDefinitionException:找不到匹配的[net.service.ContactService]類型的bean用於依賴性:期望至少1個符合此依賴性的autowire候選者。依賴註解:{@ org.springframework.beans.factory.annotation.Autowired(所需=真)}
這裏是控制器:
@Controller
@SessionAttributes
public class ContactController {
@Autowired
private ContactService contactService;
//methods...
}
的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();
}
}
ContactDaoImpl
@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();
}
}
和彈簧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>
那麼你有'contactService'字段的setter方法嗎? – sundar 2012-08-14 14:29:17
@sundar爲了使Spring注入工作,您不需要該字段的setter方法。無論如何,這裏的問題顯然是這樣的事實,就像Spring知道的那樣,注入的bean沒有被發現,並不是它被發現,但它無法注入它。 – 2012-08-14 14:35:34
@DaveNewton:呃,你說得對,我寫了一個奇怪的長答案,根本沒有提到這一點。是的,如果包含ContactServiceImpl的包不在註冊爲可註釋的那些包中,那麼該bean將不會被創建,因此不能用於其他bean中的注入 – 2012-08-14 14:37:16