logo

문제

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/>

  1. 인스턴스 이름을 바꾸어줍니다.

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>

  1. 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;
    }
}
CommentCount 0
이전 댓글 보기
등록
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
TOP