관리 메뉴

공부 기록장 💻

[Spring 이슈] Cannot construct instance of (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator) 본문

# Develop/삽질하며 배우기 🔨

[Spring 이슈] Cannot construct instance of (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)

dream_for 2023. 4. 17. 10:29

 
 
간단하게 클라이언트의 Request Body로부터 요청받은 UserDTO를 그대로 Repository로 전달한 후 Post 요청을 하는 과정에서 Serialization 오류가 발생했다.
 
 

상황

우선 요청 시 Request Body에 담는 UserDTO는 다음과 같다.
@AllArgsConstructor을 사용해 userEmail, userPw 두 필드를 인스턴스 생성시 필수적으로 넣는 arugment로 설정해주엇다.
 

 
POST method를 이용해 새로운 회원 가입을 하는 Controller은 다음과 같다.
RequestBody의 UserDTO 값을 통해 새로운 User 객체를 생성하여 DB에 저장한다.
 

 

오류 

이후 Post 요청 시 오류가 발생했다.
 

2023-04-17T10:07:03.601+09:00 ERROR 3052 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class com.cos.security1.dto.UserDTO]] with root cause

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.cos.security1.dto.UserDTO` (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]

 

cannot deserialize from Object value (no delegate- or property-based Creator) 

즉 에러는 Java의 jackson 라이브러리에서 data를 bind 하는 경우 default 생성자가 없는 상황에서 json Object 값을 deserialize 하지 못한다는 것이다.
 

 
 
StackOverflow에 검색해보니 다음과 같은 설명을 포함하고 있었다.
jackson 라이브러리가 빈 생성자가 없거나 @JsonProperty로 각 파라미터를 지정하지 않은 필드를 포함한 모델을 생성하지 못하기 때문이었다. (https://stackoverflow.com/questions/73098429/http-converter-httpmessageconversionexception-type-definition-error-simple-ty)
 
 

 
그러나 @JsonProperty의 경우 Kotlin 에서 해결할 수 있는 방법이므로, 빈 생성자를 추가하는 방법을 선택하였다.
 

해결: DTO에 빈 생성자 추가 또는 @NoArgsConstructor 추가

필드를 포함하지 않는 기본 생성자를 추가하거나, 이와 동일하게 작동하도록 하는 어노테이션 @NoArgsConstructor을 추가해주어 해결할 수 있었다.
 

 
 
위와 같이 간단하게 빈 생성자를 추가해주었다.
 
이후 POST 메소드 수행이 정상적으로 된 것을 확인할 수 있다.
 

 
 
이전 프로젝트에서는 항상 Request Body로 받은 데이터들을 추가적으로 가공하여 각 데이터 값들을 새로운 Model 객체의 필드 값으로 직접 넣는 방식을 사용해서 문제가 발생한 경우가 없었기 때문에 
이번 이슈를 통해 body에 담겨있는 json 객체를 그대로 DTO로 전환 시 기본 생성자가 꼭 포함되어 있어야 한는 것을 새로 알게 되었다.
 

728x90
반응형
Comments