TIL

2023.01.02 TIL - DTO 역직렬화 문제 (no delegate- or property-based Creator)

문제

팀프로젝트 기능 구현을 하다가 테스트를 하는데 다음과 같은 에러가 발생했다.

Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: 
Cannot construct instance of `study.ticketService.domain.application.dto.ConcertTicketCreateRequest` 
(although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator)]

 

간단하게 번역해보면 다음과 같다.

(최소 하나의 Creator가 존재하더라도): 개체 값에서 역직렬화할 수 없습니다(대리자 또는 속성 기반 Creator 없음).

 

 

원인 

Jackson에서 생성자를 만드는 다양한 Mode가 있는데  필드가 1개인 경우 기본 생성자를 만드는

Mode가 Delegating / Properties-based 로 나뉘는데, 두 Mode 중에서 어떤 것을 선택해야 할지 알 수 없어서 발생한 오류였다.

다음 이슈에서 잘 설명해준다.

 

 

Jackson fails to deserialize 1 field POJO · Issue #3085 · FasterXML/jackson-databind

Describe the bug When trying to deserialize JSON to POJO it fails when POJO has only one field. Version information 2.11.4 To Reproduce POJO: @AllArgsConstructor //lombok, if i add constructor manu...

github.com

 

 

해결

해결방법은 간단하다. @JsonCreator 어노테이션을 사용하거나, 부 생성자를 활용하거나, @JsonProperty를 사용하면 된다.

 

@JsonCreator 사용

생성자에 @JsonCreator를 사용하여 역 직렬화에 사용되는 생성자라고 명시해주면 됩니다.

 

 

 

부 생성자 사용

역직렬화를 할 때 생성할 수 있는 부 생성자를 만들어줍니다. 

 

 

@JsonProperty 사용

@JsonProperty 를 사용하여 명시적으로 json 값의 key와 객체의 필드를 매핑시켜줄 수 있다.

728x90