-
[에러 해결 완료] Type definition error , InvalidDefinitionException프로젝트/게시판 프로젝트 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가지 키워드가 눈에 들어왔습니다.
- 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
이제 올바른 400 BAD Request를 받을 수 있습니다.
출처
'프로젝트 > 게시판 프로젝트' 카테고리의 다른 글
JPA로 Update를 해보자! (0) 2022.05.14 컨트롤러를 테스트해보자! (0) 2022.05.13 테스트코드에서는 H2 DB를 사용하자! (0) 2022.05.11 Spring Rest API 예외처리 (feat. 스프링의 기본적인 예외 처리 방법과 Best Practice) (0) 2022.05.10 Controller에 인자값은 어떤값이 올 수 있을까? (0) 2022.05.06