org.springframework.beans.factory.UnsatisfiedDependencyException
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException
스프링부트를 사용하다가 위와 같은 에러가 발생하는 경우가 있다.
특정 인터페이스를 상속한 클래스 파일이 여러 개일 때
의존성 주입을 위해 @Qualifier 어노테이션을 사용하게 되는데, 이 때 실수를 하면 발생하는 에러다.
아래와 같은 DAO 파일과 Service 파일 있다고 해보자.
(전제 >>> DAO 인터페이스를 상속한 파일이 여러 개이다.)
- DAO 파일
@Repository
public class EmployeeDAOJpaImpl implements EmployeeDAO {
private EntityManager entityManager;
@Autowired
public EmployeeDAOJpaImpl(EntityManager entityManager) {
this.entityManager = entityManager;
}
@Override
public List<Employee> findAll() {
// create a query
Query query =
entityManager.createQuery("from Employee");
// execute query and get result list
List<Employee> employees = query.getResultList();
// return the results
return employees;
}
...
}
문제상황
- Service 파일
@Service
public class EmployeeServiceImpl implements EmployeeService {
private EmployeeDAO employeeDAO;
@Autowired
public EmployeeServiceImpl(@Qualifier("EmployeeDAOJpaImpl") EmployeeDAO employeeDAO) {
this.employeeDAO = employeeDAO;
}
...
}
위 코드에서 무엇이 문제일까?
분명히 @Qualifier 어노테이션에 똑같이 클래스명을 복사붙여넣기해도 해결이 안 된다.
똑같이 복사 붙여넣기한 것이 문제다.
문제의 코드
public EmployeeServiceImpl(@Qualifier("EmployeeDAOJpaImpl") EmployeeDAO employeeDAO)
해결방법
public EmployeeServiceImpl(@Qualifier("employeeDAOJpaImpl") EmployeeDAO employeeDAO)
@Qualifier 어노테이션에 클래스명을 적을 때 맨 앞 글자를 소문자로 적어줘야한다.
"EmployeeDAOJpaImpl" 가 아닌 "employeeDAOJpaImpl"으로 수정하면 된다.