Java&Spring/Spring

@Qualifier

sung.hyun.1204 2022. 10. 31. 13:34

이글은 유데미 강의 Sprin & Hibernate for Beginners 539 번 강의의 내용입니다.

 

 

다음과 같이 서비스단에서 에러가 나는 상황이다

 

 

@Repository
@RequiredArgsConstructor
public class EmployeeDAOJpaImpl implements EmployeeDAO{
    @Autowired
    private final EntityManager em;
@Repository
@RequiredArgsConstructor
public class EmployeeDAOHibernateImpl implements EmployeeDAO{
    @Autowired
    private final EntityManager em;

Service 에서 받을 implement 가 현제 두개(JPA DAO,Hibernate DAO)라 스프링에서 어떤것을 사용할지 모르겠다 라는 이야기 이다.  

 

Intellij 의 에러 메시지 이다.

 

Description:

Parameter 0 of constructor in udemycode.service.EmployeeServiceImpl required a single bean, but 2 were found:
- employeeDAOHibernateImpl: defined in file [/Users/chosunghyun/Desktop/javaStudy/SimpleJPA/udemy/udemyCode2/build/classes/java/main/udemycode/dao/EmployeeDAOHibernateImpl.class]
- employeeDAOJpaimpl: defined in file [/Users/chosunghyun/Desktop/javaStudy/SimpleJPA/udemy/udemyCode2/build/classes/java/main/udemycode/dao/EmployeeDAOJpaimpl.class]


Action:

Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed

 

 

하나의 인터페이스를 두개의 서로 다른 레퍼지토리에서 구현을 하여 스프링에 등록을 하고,

서비스단에서 인터페이스를 호출 하였을때 구현체를 찾지 못하는 오류인것 같다 . 

 

 

다음 코드에서, DAO 생성자 부분에 사용할 BeanId 를 명시 해준다.

수정 전 .

@Service
public class EmployeeServiceImpl implements EmployeeService{
    private EmployeeDAO employeeDAO;

    @Autowired
    public EmployeeServiceImpl(EmployeeDAO theEmployeeDAO) {
        employeeDAO = theEmployeeDAO;
    }

 

@Qualifier 를 사용하는데 사용할 클라스의 첫글자는 lowerCase 로 작성한다.

@Service
public class EmployeeServiceImpl implements EmployeeService{
    private EmployeeDAO employeeDAO;

    @Autowired
    public EmployeeServiceImpl( @Qualifier ("employeeDAOJpaImpl")EmployeeDAO theEmployeeDAO) {
        employeeDAO = theEmployeeDAO;
    }