Error

[Error] Resolved[org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot construct instance of

kyunge_ev 2022. 12. 27. 22:21

게시판 만들기 중 댓글 작성 기능을 구현하고 있는데 아래와 같은 에러가 발생했다.

 

Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot construct instance of
cs

 

어디가 문제인지 확인하기 위해 로그를 남겨보았는데,

Controller에 남긴 log 부터 아예 남겨지지 않았다.

 

1
2
3
4
5
6
@PostMapping("/{postsId}/comments")
public Response<CommentCreateResponse> createComment(@PathVariable Long postsId, @RequestBody CommentCreateRequest commentCreateRequest, Authentication authentication){
    log.debug("postId : {} comment : {} userName : {}", postsId, commentCreateRequest.getComment(), authentication.getName());
    CommentCreateResponse commentCreateResponse = commentService.create(postsId, commentCreateRequest.getComment(), authentication.getName());
    return Response.success(commentCreateResponse);
}
cs

 

더 정확한 에러 내용은

2023-01-03 20:33:06.647  WARN 44520 --- [nio-8080-exec-1] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot construct instance of `com.mutsasns.finalproject_kimmingyeong.domain.dto.comment.CommentCreateRequest` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator); nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `com.mutsasns.finalproject_kimmingyeong.domain.dto.comment.CommentCreateRequest` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator)<EOL> at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 2, column: 3]]

 

그리고 Controller에 @RequestBody를 빼면 에러가 발생되지 않았고,

@ResquestBody를 넣어주면서 에러가 발생이 되었다.

구글링도 해보고 회고팀에 공유도 해보았는데

회고팀 한 분이 "기본 생성자가 없을 때 발생되는 에러" 인 것 같다고 하셨다.

생각 해보니 롬복을 이용해 @AllArgsConstructor를 달아뒀는데 @NoArgsConstructor는 달아 두지 않았던것...

 

1
2
3
4
5
6
7
8
import lombok.AllArgsConstructor;
import lombok.Data;
 
@AllArgsConstructor
@Data
public class CommentCreateRequest {
    private String comment;
}
cs

 

1
2
3
4
5
6
7
8
9
10
11
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
 
@AllArgsConstructor
@NoArgsConstructor
@Data
public class CommentCreateRequest {
    private String comment;
 
}
cs

 

위의 코드와 같이 @NoArgsConstructor를 붙여 주니 에러 없이 잘돌아갔다.

추가로 검색해서 찾아보니 JSON의 기본동작을 위해선 인자가 0인 기본 생성자가 필요하다고 한다.

에러 내용을 좀 더 찾아보면 JSON parser를 하는 데 역직렬화가 되지 않아 에러가 발생되는 것인데 거기서 필요한게 기본생성자 인거다. 

앞으로 생성자를 한번 더 챙겨보는 습관을 가지고, JSON의 직렬화/역직렬화에 대해 좀 더 공부해보는 시간을 가져보면 좋을 것같다.