프로젝트/게시판 프로젝트

[에러 해결 완료] Type definition error , InvalidDefinitionException

Junuuu 2022. 5. 12. 00:01
반응형

@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가지 키워드가 눈에 들어왔습니다.

 

 

에러의 원인은 다음과 같습니다

  • 친절한 스택오버플로우에서는 이 에러가 발생한 이유를 다음과 같다고 합니다.
  • 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를 받을 수 있습니다.

 

 

 

출처

https://stackoverflow.com/questions/53191468/no-creators-like-default-construct-exist-cannot-deserialize-from-object-valu

 

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