无法在春天自动装配油田.为什么?

San*_*ejű 27 java exception spring-mvc

我一直得到这个错误,并且无法弄清楚为什么......是的我知道很多人都有类似的问题,但是阅读他们得到的答案并不能解决我的问题.

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...


}
Run Code Online (Sandbox Code Playgroud)

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();
    }

}
Run Code Online (Sandbox Code Playgroud)

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();
    }

}
Run Code Online (Sandbox Code Playgroud)

和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>
Run Code Online (Sandbox Code Playgroud)

Pyr*_*nja 34

在spring servlet .xml中:

<context:component-scan base-package="net.controller" />
Run Code Online (Sandbox Code Playgroud)

(我假设服务impl与服务接口"net.service"在同一个包中)

我认为你必须将net.service包(或所有net)添加到组件扫描中.目前spring只在net.controller中搜索组件,而你的服务impl在net.service中,它不会被spring实例化.


小智 11

我得到了同样的错误并且搜索它导致我在这里.我的修复似乎只是将@Component注释添加到抽象服务的实现中.

在这种情况下,这将是:

import org.springframework.stereotype.Component;

...

@Component
public class ContactServiceImpl implements ContactService {
Run Code Online (Sandbox Code Playgroud)


Shi*_*gon 9

那么ContactServiceImplbean 的创建存在问题.首先,确保在启动Spring上下文和ContactController创建实例时通过调试no-args构造函数来实际实例化该类.

如果ContactServiceImpl实际上是由Spring上下文实例化的,但它根本不与您的@Autowire注释匹配,请尝试在注释注入中更明确.这是一个处理类似问题的人并提供一些可能的解决方案:

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

如果你问我,我想如果你更换你会好的

@Autowired
private ContactService contactService;
Run Code Online (Sandbox Code Playgroud)

有:

@Resource
@Qualifier("contactService")
private ContactService contactService;
Run Code Online (Sandbox Code Playgroud)


小智 6

当您收到此错误时,缺少某些注释.我在服务上缺少@service注释.当我添加该注释时,它对我来说很好.