[Lombok] @Builder 오류 - InvalidDefinitionException

2021. 4. 8. 17:00Spring

Springboot 테스트 코드 작성 중... InvalidDefinitionException 이 발생하였고

@Builder 를 사용한 객체를 인스턴스화 하는 라인에서 오류가 나는 걸 확인하였다.

 

 

오류 메시지는 다음과 같다.

HttpMessageConversionException: Type definition error: [simple type, class com.example.userservice.dto.RequestUser]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.example.userservice.dto.RequestUser` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)

=> 생성자가 없다는 오류이다.

 

 

오류난 코드를 보면, Class 위에 @Builder 를 사용하였다.

@Data
@Builder
public class RequestUser {
    private String email;
    private String name;
    private String pwd;
}

클래스 위에 @Builder 를 사용할 경우, 모든 멤버 변수에 대해서 매개변수를 받는 기본 생성자를 만든다.

정확히는 @Builder 사용 시, @AllArgsConstructor(access = AccessLevel.PACKAGE) 가 암묵적으로 붙어서 사용된다.

 

그러면 문제를 알 수 있다. 클래스 파일에 매개변수를 가진 생성자가 존재하기 때문에 기본 생성자가 필요한 것이다.

설명을 추가하면, 생성자가 단 하나라도 존재하는 경우 컴파일러는 자동으로 기본 생성자를 만들어주지 않는다. 그래서 개발자가 직접 기입해줘야 한다.

 

 

해결을 위해 해당 클래스에 기본 생성자를 만들어주자.

@Data
@Builder
@NoArgsConstructor	// 추가
public class RequestUser {
    private String email;
    private String name;
    private String pwd;
}

 

 

 

하지만 또 하나의 오류를 볼 수 있다.

required: no arguments

=> 이제는 매개변수를 가진 생성자가 없다는 오류이다.... 아까는 자동으로 생성해주더니 왜 그럴까?

이유는 @Builder 를 적용한 클래스 파일에 기본 생성자가 존재할 경우, 따로 어떠한 생성자도 만들어주지 않는다. 그래서 @Builder @NoArgsConstructor를 함께 사용하려면, 모든 필드를 가지는 @AllArgsConstructor 도 함께 사용해주어야 한다.

 

 

그리하여 생성자를 만들어주면, 오류가 해결되는 걸 확인할 수 있다.

@Data
@Builder
@NoArgsConstructor	// 추가
@AllArgsConstructor	// 추가
public class RequestUser implements Serializable {
    private String email;
    private String name;
    private String pwd;
}

 

'Spring' 카테고리의 다른 글

[Security] UserDetails 반환 시, password 는 null 이다. 왜?  (0) 2021.05.17
Spring Rest Docs 적용 (1)  (0) 2021.03.02