[Spring] NoUniqueBeanDefinitionException 원인과 해결

Fraise_KIM·2023년 8월 15일
0
post-custom-banner

⛔️ NoUniqueBeanDefinitionException

  • Autowired 는 타입(Type)으로 조회하기 때문에, 동일한 타입의 빈이 2개 이상일 때 문제가 발생한다.

org.springframework.beans.factory.UnsatisfiedDependencyException : Error creating bean with name 'filmServiceImpl' defined in file [경로]: Unsatisfied dependency expressed through constructor parameter 1; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type '-경로.Movie' available: expected single matching bean but found 2: comedyMovie, RomanceMovie



💡Solution1. @Primary

  • 여러 빈이 매칭 되는 경우, @Primary가 우선순위이다.
@Component
@Primary
public class ComedyMovie implements Movie {
	...
}

💡Solution2. @Qualifier

  • 추가로 이름을 구분하여 사용하기 위한 용도 (실제 빈의 이름을 변경하는 것은 아님)
@Component
@Qualifier("mainMovie")
public class ComedyMovie implements Movie {
	...
}
@Component
@Qualifier("subMovie")
public class RomanceMovie implements Movie {
	...
}
@Component
public class filmServiceImpl implements filmService {

    private final MemberRepository memberRepository;
    private final Movie movie;

    @Autowired
    public OrderServiceImpl(MemberRepository memberRepository, @Qualifier("mainMovie") Movie movie) {
        this.memberRepository = memberRepository;
        this.movie = movie;
    }

   ...
}
  • 조회 순서
    @Qualifier -> 빈 이름 매칭 -> NoSuchBeanDefinitionException 예외 발생

💡Solution3. @Autowired 필드 명

  • 타입으로 조회했는데 여러 빈이 있는 경우, 필드명으로 추가 매칭한다.
@Component
public class filmServiceImpl implements filmService {

    private final MemberRepository memberRepository;
    private final Movie movie;

    @Autowired
    public OrderServiceImpl(MemberRepository memberRepository, Movie comedyMovie) {
        this.memberRepository = memberRepository;
        this.movie = comedyMovie;
    }

   ...
}

post-custom-banner

0개의 댓글