我一直收到这个错误,并且无法弄清楚为什么......是的我知道有很多人有类似的问题,但是阅读他们得到的答案并不能解决我的问题。
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用于依赖:预期至少有一个bean有资格作为此依赖项的autowire候选者。依赖注释:{@ org.springframework.beans.factory.annotation.Autowired(required = true)}
这是控制器:
@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();
}
}
和spring-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 :(得分:34)
在spring servlet中.xml:
<context:component-scan base-package="net.controller" />
(我假设服务impl与服务接口“net.service”位于同一个包中)
我认为您必须将net.service包(或所有net)添加到组件扫描中。目前spring只在net.controller中搜索组件,而你的服务impl在net.service中,它不会被spring实例化。
答案 1 :(得分:11)
我遇到同样的错误并且搜索它导致我在这里。我的修复似乎只是将@Component注释添加到抽象服务的实现中。
在这种情况下,看起来像:
import org.springframework.stereotype.Component;
...
@Component
public class ContactServiceImpl implements ContactService {
答案 2 :(得分:9)
创建ContactServiceImpl
bean存在问题。首先,确保在启动Spring上下文时以及创建ContactController
的实例时,通过调试no-args构造函数来实际实例化该类。
如果ContactServiceImpl
实际上是由Spring上下文实例化的,但它与您的@Autowire
注释完全不匹配,请尝试在注释注入中更明确。这是一个处理类似问题的人并提供一些可能的解决方案:
http://blogs.sourceallies.com/2011/08/spring-injection-with-resource-and-autowired/
如果你问我,我认为如果你更换
你会没事的@Autowired
private ContactService contactService;
使用:
@Resource
@Qualifier("contactService")
private ContactService contactService;
答案 3 :(得分:6)
当您收到此错误时,缺少某些注释。 我在服务上缺少@service注释。当我添加该注释时,它对我来说很好。
答案 4 :(得分:1)
我今天遇到了同样的问题。原来我忘了为我的服务实现文件提及@Service / @ Component注释,spring无法自动装配并且无法创建bean。
答案 5 :(得分:0)
我有完全相同的问题 尝试将两个类放在同一个包中,并在pom.xml中添加一行
<dependency>
<groupId> org.springframework.boot </groupId>
<artifactId> spring-boot-starter-web </artifactId>
<version> 1.2.0.RELEASE </version>
</dependency>
答案 6 :(得分:0)
在java配置中,请确保您已在RootConfig中导入配置,如下所示 @Import(PersistenceJPAConfig.class)