Не удалось внедрить автосвязанные зависимости; вложенным исключением является org.springframework.beans.factory.BeanCreationException:

я пытаюсь создать пример из весенней транзакции с apache tomcat и postgresql, но получаю сообщение об ошибке. Не удалось внедрить автосвязанные зависимости.

Исключение

javax.servlet.ServletException: Servlet.init() for servlet dispatcher threw exception
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
    org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
    org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
    org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    java.lang.Thread.run(Thread.java:724)

root cause

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'loginController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private DAO.TblUserManager_DAO Controllers.LoginController.user; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [DAO.TblUserManager_DAO] is defined: expected single matching bean but found 2: [tblUserManager_DAOImpl, TblUserManager_DAOImpl]
    org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:287)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1106)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
    org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
    org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
    org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
    org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
    org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:585)
    org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913)
    org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464)
    org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:631)
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:588)
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:645)
    org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:508)
    org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:449)
    org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:133)
    javax.servlet.GenericServlet.init(GenericServlet.java:212)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
    org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
    org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
    org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    java.lang.Thread.run(Thread.java:724)

root cause

org.springframework.beans.factory.BeanCreationException: Could not autowire field: private DAO.TblUserManager_DAO Controllers.LoginController.user; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [DAO.TblUserManager_DAO] is defined: expected single matching bean but found 2: [tblUserManager_DAOImpl, TblUserManager_DAOImpl]
    org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:506)
    org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
    org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:284)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1106)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
    org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
    org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
    org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
    org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
    org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:585)
    org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913)
    org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464)
    org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:631)
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:588)
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:645)
    org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:508)
    org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:449)
    org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:133)
    javax.servlet.GenericServlet.init(GenericServlet.java:212)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
    org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
    org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
    org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    java.lang.Thread.run(Thread.java:724)

root cause

org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [DAO.TblUserManager_DAO] is defined: expected single matching bean but found 2: [tblUserManager_DAOImpl, TblUserManager_DAOImpl]
    org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:800)
    org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:707)
    org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:478)
    org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
    org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:284)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1106)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
    org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
    org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
    org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
    org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
    org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:585)
    org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913)
    org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464)
    org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:631)
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:588)
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:645)
    org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:508)
    org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:449)
    org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:133)
    javax.servlet.GenericServlet.init(GenericServlet.java:212)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
    org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
    org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
    org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    java.lang.Thread.run(Thread.java:724)

мой dispacher-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:p="http://www.springframework.org/schema/p"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        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.1.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd        
       http://www.springframework.org/schema/context 
       http://www.springframework.org/schema/context/spring-context-2.5.xsd">

    <context:annotation-config />
    <context:component-scan base-package="Controllers" /> 
    <context:component-scan base-package="DAO" />
    <mvc:annotation-driven />
    <tx:annotation-driven transaction-manager="transactionManager"/> 


    <bean id="viewResolver"
          class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          p:prefix="/WEB-INF/jsp/"
          p:suffix=".jsp" />

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="org.postgresql.Driver" />
        <property name="url" value="jdbc:postgresql://localhost:5432/car" />
        <property name="username" value="----" />
        <property name="password" value="-----" />
    </bean>

    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="annotatedClasses" >
            <list>
                <value>DAOModel.Tblusers</value>
                <value>DAOModel.Tblcars</value>
            </list>
        </property>
        <property name="dataSource" ref="dataSource" />
        <property name="packagesToScan" value="DAOModel" />
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
            </props>
        </property>
        <!-- <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" /> -->
    </bean>

    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager" >
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
    <bean id = "Tblusers_DAOImpl" class="DAO.Tblusers_DAOImpl">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
   <bean id = "TblUserManager_DAOImpl" class="DAO.TblUserManager_DAOImpl">

    </bean>
</beans>

мой репозиторий, сервис, компонент

    @Component
    public interface Tblusers_DAO {
        public void adduser(Tblusers user);
    }


    @Repository
    public class Tblusers_DAOImpl implements Tblusers_DAO{

        @Autowired
        private SessionFactory sessionFactory;

        @Override
        public void adduser(Tblusers user) {
            this.getSessionFactory().getCurrentSession().saveOrUpdate(user);
        }


        public SessionFactory getSessionFactory() {
            return sessionFactory;
        }


        public void setSessionFactory(SessionFactory sessionFactory) {
            this.sessionFactory = sessionFactory;
        }
    }



@Component
public interface TblUserManager_DAO {
    public void adduser(Tblusers user);
}



@Service
public class TblUserManager_DAOImpl implements TblUserManager_DAO{

    @Autowired
    private TblUserManager_DAO dao;

    @Override
    @Transactional
    public void adduser(Tblusers user) {
       dao.adduser(user);
    }

    public void setDao(TblUserManager_DAO dao) {
        this.dao = dao;
    }

}

и контроллер

public class LoginController {

    @Autowired
    private  TblUserManager_DAO user;
    @RequestMapping(value = "/Login", method = RequestMethod.POST)
    public ModelAndView setLgin(@ModelAttribute("LoginModel") LoginModel login) {
        ModelAndView model = new ModelAndView();
        Tblusers user2=new Tblusers();
        user2.setTblusersId(3);
        user2.setTblusersFamily(login.getUsername());
        user2.setTblusersPassword(login.getPassword());
        user.adduser(user2);
        model.addObject("Hello", login.getUsername());
        return model;
    }
 public void setUser(TblUserManager_DAO user) {
        this.user = user;
    }

}

person ATJVS    schedule 15.02.2014    source источник
comment
возможный дубликат BeanCreationException в Spring Autowiring   -  person Brian Clozel    schedule 16.02.2014


Ответы (3)


Когда вы компонентно сканируете класс с аннотацией @Component, @Repository, @Service, @Configuration и т. д., Spring неявно создает для него bean-компонент. Он также создает для него bean-компонент, когда вы явно объявляете его, т.е. это

<bean id = "Tblusers_DAOImpl" class="DAO.Tblusers_DAOImpl">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>
<bean id = "TblUserManager_DAOImpl" class="DAO.TblUserManager_DAOImpl">

Итак, в настоящее время у вас есть два bean-компонента для TblUserManager_DAOImpl и Tblusers_DAOImpl. Spring не знает, какой из них вводить в такие поля, как

@Autowired
private  TblUserManager_DAO user;

потому что есть два кандидата. Либо удалите объявление <bean>, либо уточните цель внедрения с помощью чего-то вроде @Qualified, чтобы выбрать соответствующий bean-компонент.

Вот документация. Просмотрите его, чтобы понять весь процесс сканирования компонентов.


Как заявил Дж. Б. Низе ниже, вы должны аннотировать фактический класс реализации только с помощью @Component или любой его специализации. Подумайте об этом с точки зрения семантики: интерфейс не является компонентом, для интерфейса нельзя создать компонент. Только фактический класс, реализация интерфейса, может быть компонентом.

person Sotirios Delimanolis    schedule 15.02.2014
comment
+1. И не аннотируйте интерфейс bean-компонентов с помощью @Component. Только реализация должна быть аннотирована. - person JB Nizet; 15.02.2014
comment
это решение не работает, когда я добавляю @Qualifier(user) в Controller. - person ATJVS; 15.02.2014
comment
@ATJVS Объясните мне, почему вы определили его значением user. Почему вы думаете, что это должно сработать? - person Sotirios Delimanolis; 15.02.2014
comment
потому что есть два кандидата. Либо удалите объявление ‹bean›, либо уточните цель внедрения с помощью чего-то вроде @Qualified. - person ATJVS; 15.02.2014
comment
@ATJVS Да, но почему значение user? Вот глава о том, как использовать @Qualifier из документации. - person Sotirios Delimanolis; 15.02.2014

Зарегистрируйте свои bean-компоненты либо с помощью записей beandefenition в файле xml, либо с помощью аннотаций, таких как @component, @Repository, @Service. Более того,

<context:annotation-config/> and <context:component-scan/>

Оба эти элемента используются в вашем коде. Вы можете просто использовать <context:component-scan/> соответствующим образом, поскольку он будет делать то же самое, что и другой, а также во избежание двусмысленности.

person Magesh    schedule 12.04.2014

Всякий раз, когда вы внедряете какой-либо объект, вы должны предоставить его методы установки и получения. это решит вашу проблему.

person Shivshanker Mhadiwale    schedule 14.07.2015