[에러 해결 완료] Type definition error , InvalidDefinitionException
@Valid 애노테이션을 활용하여 데이터 검증을 테스트하기 위해서 POSTMAN으로 회원가입 POST 요청을 보내는 과정에서 400 BAD REQUEST를 기대하였으나 500 에러가 발생하였습니다.
왜 그럴까 하고 실제로 에러 메시지를 출력해보았습니다.
다음과 같은 에러가 발생했습니다.
Type definition error: [simple type, class anthill.Anthill.dto.member.MemberRequestDTO]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `anthill.Anthill.dto.member.MemberRequestDTO` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 2, column: 5]
에러 메시지를 쭉 읽어보게 되었을때 3가지 키워드가 눈에 들어왔습니다.
- Type definition error
- com.fasterxml.jackson.databind.exc.InvalidDefinitionException
- no delegate- or property-based Creator
에러의 원인은 다음과 같습니다
- 친절한 스택오버플로우에서는 이 에러가 발생한 이유를 다음과 같다고 합니다.
- jackson library가 빈 생성자가 없는 모델을 생성하는 방법을 모릅니다.
따라서 원인을 해결하기위해 빈 생성자를 추가해주었습니다.
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@Builder
@Getter
public class MemberRequestDTO {
//@NotNull : Null만 허용하지 않음 "", " "허용
//@NotEmpty : null, "" 허용하지 않음 " "허용
//@NotBlank : null, ""," "허용하지 않음
//@Pattern : 지정된 패턴만 입력하게 하여 휴대폰 번호 폼에서 이상한 값들이 요청되는 것을 방지합니다.
@NotBlank(message = "아이디를 입력해주세요.")
@Size(min = 5, max = 20, message = "아이디는 5자 이상 20자 이하로 입력해주세요.")
private String userId;
@NotBlank(message = "비밀번호를 입력해주세요.")
@Size(min = 8, message = "비밀번호를 8자 이상으로 입력해주세요.")
private String password;
@NotBlank(message = "별명을 입력해주세요.")
@Size(max = 20, message = "별명을 20자 이하로 입력해주세요.")
private String nickName;
@NotBlank(message = "이름을 입력해주세요.")
private String name;
@NotBlank(message = "휴대전화번호를 입력해주세요.")
@Pattern(regexp = "(01[016789])(\\d{3,4})(\\d{4})", message = "올바른 휴대폰 번호를 입력해주세요.")
private String phoneNumber;
Address address;
public Member toEntity() {
return Member.builder().userId(userId).password(password).nickName(nickName).name(name).phoneNumber(phoneNumber).address(address).build();
}
}
@Builder를 사용하고 있기 때문에 @NoArgsConstructor만 추가하게 되면 빌더 패턴에서 컴파일 에러가 발생하기 때문에 @AllArgsConstructor까지 같이 추가해주었습니다.
위의 내용이 이해가 되지않는다면 아래의 글을 읽으시면 좋을 것 같습니다.
https://junuuu.tistory.com/276?category=997278
@Builder 제대로 알고 사용해보기
Lombok의 @Builder를 사용하게 되면 빌더 패턴을 매우 간단하게 적용할 수 있습니다. 빌더 패턴이란? 빌더 패턴이란 인스턴스(객체)를 생성할 때 생성자만을 통해서 생성하는데 어려움이 있기 때문
junuuu.tistory.com
이제 올바른 400 BAD Request를 받을 수 있습니다.
출처
No Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator
I am trying to consume an API using Retrofit and Jackson to deserialize. I am getting the onFailure error No Creators, like default construct, exist): cannot deserialize from Object value (no deleg...
stackoverflow.com