NoUniqueBeanDefinitionException: не имеет квалификационного bean типа... я определено, ожидаемое единственное соответствие bean, но найдено 2

Мы немного искали в Интернете и в наших книгах в мягкой обложке, но не можем найти решение нашей проблемы:

Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [services.GebruikerDAO] is defined: expected single matching bean but found 2: gebruikerDAO,GebruikerDAO
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:863)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:768)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:486)
... 58 more

Чтобы набросать некоторую справочную информацию: мы должны создать небольшой веб-сайт с использованием java-страниц jsp и всех вместе с spring security и maven с помощью БД для получения информации и проверки информации. Ниже перечислены все наши файлы.

Это наш класс GebruikerDAO:

package services;
import domein.Gebruiker;

public interface GebruikerDAO extends GenericDao<Gebruiker>{

    public Gebruiker getGebruikerByStamnummer(String stamnummer);

}

Это наш класс JpaGebruikerDao:

@Repository("gebruikerDAO")
public class JpaGebruikerDao extends GenericDaoJpa<Gebruiker> implements GebruikerDAO{

    @PersistenceContext
    private EntityManager em;

    public JpaGebruikerDao()
    {
        super(Gebruiker.class);
    }

    /*@Override
    @Transactional
    public List<Gebruiker> findAll() {
        CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
        CriteriaQuery<Gebruiker> criteriaQuery = criteriaBuilder.createQuery(Gebruiker.class);

        Root<Gebruiker> gebruiker = criteriaQuery.from(Gebruiker.class);

        criteriaQuery.orderBy(criteriaBuilder.desc(gebruiker.get(Gebruiker_.familienaam)));

    // JPQL select 
        criteriaQuery.select(gebruiker);

        TypedQuery<Gebruiker> query = em.createQuery(criteriaQuery);
        return query.getResultList();
    }*/

    // CRUD methods
    @Override
    @Transactional
    public Gebruiker update(Gebruiker gebruiker) {
        return em.merge(gebruiker);
    }

    @Override
    @Transactional(readOnly = true)
    public Gebruiker get(String id) {
        return em.find(Gebruiker.class, id);
    }

    @Override
    @Transactional
    public void insert(Gebruiker gebruiker) {
        em.persist(gebruiker);
    }

    @Override
    @Transactional
    public void delete(Gebruiker gebruiker) {
        em.remove(em.merge(gebruiker));
    }

    @Override
    public Gebruiker getGebruikerByStamnummer(String stamnummer) {
        return get(stamnummer);
    }
}

Это наш класс контроллера:

@Controller
public class PlanningController {

    @Autowired
    @Qualifier("GebruikerDAO")
    private GebruikerDAO gebruikerDao;

    @RequestMapping(value = "/planning", method = RequestMethod.GET)
    public String listGuest(Model model)
    {
        List<Gebruiker> gebruikerlijst = gebruikerDao.findAll();
        List<Student> studentlijst = new ArrayList<>();

        for (Gebruiker s : gebruikerlijst) {
            if (s instanceof Student){
                Student student = (Student)s;
                if(student.getLokaal() != null)
                {
                    studentlijst.add(student);
                }
            }
        }
        // there is more but it just checks for if a timeslot is available in our planning

Это наш spring -security файл:

<beans:beans xmlns="http://www.springframework.org/schema/security"
         xmlns:beans="http://www.springframework.org/schema/beans"
         xmlns:p="http://www.springframework.org/schema/p"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="
            http://www.springframework.org/schema/security
            http://www.springframework.org/schema/security/spring-security-3.1.xsd
            http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">

<beans:import resource="applicationContext.xml"/>

<http auto-config="true">
    <intercept-url pattern="/admin*" access="hasAnyRole('ROLE_Student', 'ROLE_Promotor', 'ROLE_Coordinator')"/>
    <logout logout-success-url="/planning.htm"/>
    <access-denied-handler ref="accessDeniedHandler"/>
    <remember-me/>
</http>

<authentication-manager>
    <authentication-provider>
        <password-encoder hash="sha-256"/>
        <jdbc-user-service data-source-ref="dataSource"
                           users-by-username-query="select StamNummer, WachtwoordEncrypted, 'true' as enabled from gebruiker where StamNummer=?"
                           authorities-by-username-query="select StamNummer, Type as authority from gebruiker where StamNummer=?"
                           role-prefix="ROLE_"
        />
    </authentication-provider>
</authentication-manager>

<beans:bean class="org.springframework.security.web.access.expression.DefaultWebSecurityExpressionHandler"/>

Это наш файл приложения:

<?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: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">

    <bean name = "GebruikerDAO" class="services.JpaGebruikerDao"/>
</beans>

Это наш файл диспетчера-сервлета:

<?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:tx="http://www.springframework.org/schema/tx"
   xmlns:mvc="http://www.springframework.org/schema/mvc"
   xmlns:context="http://www.springframework.org/schema/context"
   xmlns:jee="http://www.springframework.org/schema/jee"
   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-3.1.xsd
http://www.springframework.org/schema/jee
http://www.springframework.org/schema/jee/spring-jee-3.1.xsd">   

<mvc:annotation-driven />
<context:component-scan base-package="controller"/>
<context:component-scan base-package="services"/>

<bean id="accessDeniedHandler" class="handler.MyAccessDeniedHandler">
    <property name="accessDeniedUrl" value="403"/>
</bean>

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/bachelorproef"/> <!--  jdbc:mysql://localhost:3306/mysql?zeroDateTimeBehavior=convertToNull-->
    <property name="username" value="root"/>
    <property name="password" value="root"/>
</bean>
<bean id="entityManagerFactory"
      class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan">
        <list>
            <value>domein</value>
        </list>
    </property>
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="showSql" value="true" /> 
            <property name="generateDdl" value="true" />
            <property name="database" value="MYSQL"/>
        </bean>
    </property>
</bean>

<bean id="transactionManager" 
      class=" org.springframework.orm.jpa.JpaTransactionManager ">
    <constructor-arg ref="entityManagerFactory" />
</bean>

<tx:annotation-driven transaction-manager="transactionManager"/>

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

Это наш файл web.xml:

<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-   app_2_4.xsd">
<display-name>Spring MVC Application</display-name> 
<servlet>
    <servlet-name>dispatcher</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet>
<servlet-mapping>
    <servlet-name>dispatcher</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener>
<context-param>
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/dispatcher-servlet.xml, 
                            /WEB-INF/spring-security2.xml
    </param-value> 
</context-param> 
<filter>
    <filter-name>springSecurityFilterChain</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
</filter>
<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping>
</web-app>

Это наш класс Гебруикер:

@Entity
@Table(name = "gebruiker")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "Type")
public abstract class Gebruiker implements Serializable {

@Id
@Column(name = "StamNummer")
private String stamNummer;
@Column(name = "Familienaam")
private String familienaam;
@Column(name = "Voornaam")
private String voornaam;
@Column(name = "Email")
private String email;
@Column(name = "Wachtwoord")
private String wachtwoord;
@Column(name = "Campus")
private String campus;
@Transient
private String naam;

public Gebruiker() {

}
(+ some extra getters, setters and generatePassword methods)

Это наш класс учеников:

@Entity
@DiscriminatorValue("Student")
public class Student extends Gebruiker{

@ManyToOne
private Promotor promotor;

@OneToOne
@JoinColumn(name = "HuidigDossier_DossierId")
private Dossier dossier;

@Temporal(TemporalType.TIMESTAMP)
private Date datumPresentatie;  

private String lokaal;
(+ some getters, setters and toString)

Это наш класс Promotor:

@Entity
@DiscriminatorValue("Promotor")
public class Promotor extends Gebruiker {

    @OneToMany(mappedBy="promotor")
    List<Student> studenten;

    public Promotor(){
         studenten = new ArrayList<>();
    }

    public List<Student> getStudenten() {
        return studenten;
    }

    public void setStudenten(List<Student> studenten) {
        this.studenten = studenten;
    }

}

Это наш класс BPCoordinator:

@Entity
@DiscriminatorValue("Coordinator")
public class BPCoordinator extends Gebruiker{

    public BPCoordinator(){

    }
}

Я знаю, что существует много информации, если ошибка NoUniqueBeanDefinitionException возникает, но это почти всегда относится к entityManager, здесь он говорит, что и gebruikerDAO, и GebruikerDAO, или что-то найдено, и мы понятия не имеем, где он их получает от или почему эта ошибка возникает. Большая часть этого кода была почти полностью скопированной парой из других школьных проектов и букмекерского кода (наш курс, предоставленный нам нашими лекторами)

Идеи, где и как исправить эту проблему, было бы удивительно.

Ответ 1

Удалите <bean name = "GebruikerDAO" class="services.JpaGebruikerDao"/> из конфигурации XML (и если все, что существует в конфигурации, я предлагаю удалить весь файл).

Это необходимо, так как JpaGebruikerDao уже регистрируется как (репозиторий) bean через сканирование компонентов (под именем gebruikerDAO).

Ответ 2

Удалите аннотацию @Repository ( "gebruikerDAO" ) из класса JpaGebruikerDao, так как она уже зарегистрирована, ИЛИ Удалить

Ответ 3

Есть два возможных решения для этого исключения. 1- Определить класс только в файле XML и использовать @Qualifier:

public class PlanningController {

@Autowired
@Qualifier("GebruikerDAO")
private GebruikerDAO gebruikerDao;

В XML определите bean только для PlanningController

2- Или удалите аннотацию классификатора и добавьте геттеры и сеттеры или конструктор в PlanningController, а затем в XML определите контекст со свойством:

<bean class="[path of PlanningController]">
<property name="gebruikerDao" ref="[GebruikerDAO implementation bean name]"/>

Ответ 4

В этой статье мы обсуждаем Spring org.springframework.beans. factory.NoUniqueBeanDefinitionException - это распространенное исключение, генерируемое BeanFactory, когда он находит два бина одного типа в контексте Spring.

Описание исключения: Исключение выдается, когда BeanFactory запрашивает экземпляр компонента, для которого было найдено несколько подходящих кандидатов, когда ожидался только один соответствующий компонент. Полная трассировка стека исключений:

Exception in thread "main" org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dao.DemoBean#0' defined in class path resource [applicationContext.xml]: Unsatisfied dependency expressed through bean property 'dao'; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'dao.DaoBean' available: expected single matching bean but found 2: daoBean,dao
  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireByType(AbstractAutowireCapableBeanFactory.java:1439)
  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1326)
  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:578)
  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:501)
  at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:317)
  at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
  at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:315)
  at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
  at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:760)
  at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:869)
  at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550)
  at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:144)
  at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:85)
  at test.Test.main(Test.java:11)
Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'dao.DaoBean' available: expected single matching bean but found 2: demoBean,dao
  at org.springframework.beans.factory.config.DependencyDescriptor.resolveNotUnique(DependencyDescriptor.java:215)
  at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1116)
  at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1065)
  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireByType(AbstractAutowireCapableBeanFactory.java:1424)
  ... 13 more

Файл конфигурации Spring:

<!-- applicationContext.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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- bean definitions here -->
  <bean id="daoBean" class="dao.DaoBean">
    <property name="name" value="spring in action"/>

  </bean>
  <bean id="dao" class="dao.DaoBean">
    <property name="name" value="spring in action"/>

  </bean>
</beans>

Класс DaoBean:

public class DaoBean {
  public String name;

  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }

  public void getDataFromDb() {
  System.out.println("Getting Data From Db");

  }
}

Код клиента:

import org.springframework.context.support.ClassPathXmlApplicationContext;
import dao.DaoBean;
public class Test {

  public static void main(String[] args) {

    try(ClassPathXmlApplicationContext container = new ClassPathXmlApplicationContext("applicationContext.xml");)
        {
      DaoBean dao = container.getBean(DaoBean.class);
      dao.add();
      System.out.println("printing name "+dao.name);
        }
    }
  }

Причина исключения: весь код в порядке, но если мы посмотрим в файл applicationContext.xml, мы легко увидим, что два раза кофигурируем класс DaoBean, хотя это не даст вам никакой ошибки компиляции, но во время выполнения в контексте весны будет два экземпляра одного и того же компонента, т.е. daoBean и dao, который является причиной исключения, контекст Spring находится между двумя компонентами, и контекст не может внедрить правильный компонент в код клиента

Решение. Просто удалите один тег bean-компонента из файла applicationContext.xml, как указано ниже, и весь код будет работать нормально.

<!-- applicationContext.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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- bean definitions here -->
  <bean id="daoBean" class="dao.DaoBean">
    <property name="name" value="spring in action"/>

  </bean>

</beans>

Если мы не хотим изменять файл applicationContext.xml, мы можем использовать аннотацию @Qualifier для внедрения DemoBean в наш клиентский код.

Для получения дополнительной информации нажмите: https://www.quora.com/How-can-I-do-to-automatics-reset-auto-increment-values-in-MySQL-table/answer/Shadab-Kazi-17