@RequiredArgsConstructor과 @Qualifier 같이 사용 시 이슈 해결법
Mar 08, 2020 조회수 4556
문제
Lombok
의 @RequiredArgsConstructor
는
final
인 필수 멤버변수에 대해서, 자동으로 생성자를 만들어주는 어노테이션입니다.
문제는 다음과 같은 상황일때, 발생합니다.
@RequiredArgsConstructor
public class WantQuailfierAutowired{
@Qualifier("myTarget")
private final Target taget;
}
<br>
spring
의 @Qualifier
를 사용하여, 주입되는 Bean
을 지정해주었지만, 다음 에러가 발생합니다.
Parameter 0 of constructor in podo.WantQuailfierAutowired required a single bean, but 2 were found:
<br>
원인
Lombok
은 @RequiredArgsConstructor
어노테이션을 인지하고, 자동으로 생성자를 이상없이 만듭니다.
하지만 생성자에 인자를 표시할때, @Quailfier
어노테이션을 인자에 표시해주지 않습니다.
WantQuailfierAutowired.class
@RequiredArgsConstructor
public class WantQuailfierAutowired{
@Qualifier("myTarget")
private final Target taget;
public WantQuailfierAutowired(Target target){ // @Qualifier를 달라!!!
this.target = target;
}
}
따라서 spring
은, 이 클래스 Bean이 N개인데, 뭘 주입하라는거지?
라는 에러를 보여주게됩니다.
<br>
해결법
2가지 해결법이 있습니다.
<br/>
- 인스턴스 이름을 바꾸어줍니다.
You may use spring trick to qualify field by naming it with desired qualifier without @Qualifier annotation.
@RequiredArgsConstructor
public class WantQuailfierAutowired{
//@Qualifier("myTarget")
private final Target myTarget; // 인스턴스 이름 변경!
}
<br>
Lombok
을 설정해줍니다.
프로젝트 최상단에 lombok.config
파일을 생성합니다.
그리고 다음 코드를 삽입합니다.
lombok.copyableAnnotations += org.springframework.beans.factory.annotation.Qualifier
혹시 모르니
build clean
을 실행하여, 기존class
파일을 삭제합니다.
새로 생성된 class
파일을 확인하면, 생성자의 인자에 @Quailfier
어노테이션을 확인 할 수 있습니다.
WantQuailfierAutowired.class
@RequiredArgsConstructor
public class WantQuailfierAutowired{
@Qualifier("myTarget")
private final Target taget;
public WantQuailfierAutowired(@Qualifier("myTarget") Target target){
this.target = target;
}
}
'@RequiredArgsConstructor과 @Qualifier 같이 사용 시 이슈 해결법' 관련된 다른글
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.