티스토리 뷰

 (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)  

 

Jackson을 사용해서 JSON을 파싱하는데 아래와 같은 에러 메시지가 떴고, 이를 해결하기 위한 방안이다.

2021-10-12 02:19:05.038 ERROR 11654 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with 
path [] threw exception [Request processing failed; nested exception is org.springframework.http.converter.HttpMessageConversionException: Type definition error: 
[simple type, class xxxxxxxxxx.xxxxxxxxx.xxx.xxxxxxxxxx]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct 
instance of `nxxxxxxxxxx.xxxxxxxxx.xxx.xxxxxxxxxx` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or 
property-based Creator)
 at [Source: (PushbackInputStream); line: 2, column: 9]] with root cause
cs

 

 


객체 생성자의 매개변수로 JSON 속성값이 전달되지 않아 발생한 오류인데,

이를 (JSON 생성자를 객체 생성자로 제대로 전달) 해결하는데에 다음과 같은 방법이 존재한다.

기존 생성자

public Bucketlist(int mem_idnum, int bk_id){
        this.mem_idnum = mem_idnum;
        this.bk_id = bk_id;
    }
cs

 

 

 

1. @JsonCreator

Jackson에서 제공하는 @JsonCreator, @JsonProperty 를 값을 전달할 생성자와 메서드 파라미터에 붙인다.

객체 생성자에 @JsonCreator 선언하면 된다.

@JsonCreator
public Bucketlist(
        @JsonProperty("mem_idnum"int mem_idnum,
        @JsonProperty("bk_id"int bk_id) {
    this.mem_idnum = mem_idnum;
    this.bk_id = bk_id;
}
cs

 

장점

  • JSON의 속성명과 객체의 멤버변수명이 다를 때도 자연스럽게 활용할 수 있다.
  • 생성자가 에러 개 일때 Jackson에서 사용할 생성자를 명시적으로 지정할 수 있다.

 

단점

  • Jackson에 의존적인 방법입니다.
  • Jar파일로 배포하는 클래스 안에서 이 방법을 사용하려면 Jackson에 대한 의존성이 추가된다.
  • JSON 파싱 라이브러리를 교체한다면 전체 클래스를 수정해야 한다.
     
     

 

 

2. @ConstructorProperties

생성자의 파라미터 이름을 지정하는 표준적인 방법.

생성자에 @ConstructorProperties 으로 파라미터의 이름을 지정하면, Jackson 으로 파싱한 JSON 속성값을 생성자의 파라미터로 전달한다.

 

@ConstructorProperties({"mem_idnum""bk_id"})
public Bucketlist(int mem_idnum, int bk_id){
    this.mem_idnum = mem_idnum;
    this.bk_id = bk_id;
}
cs

 

장점

  • @JsonCreator + @JsonProperties 보다는 코딩량이 조금 적다.
  • Jackson에 의존적이지 않다.
  • 같은 방식을 지원하는 다른 JSON 파싱 라이브러리로 교체할 때 코드 변경이 없다.

단점

  • JSON의 속성명과 생성자의 실제 파라미터 명이 다른 경우에는 사용하는 것이 부자연스럽습니다.

 

 


출처

 

Jackson으로 파싱한 JSON 속성값을 생성자로 전달하기 - 개발수양록

파싱하고자하는 JSON { "accessDateTime": "2019-10-10T11:14:16Z", "ip": "175.242.91.54", "username": "benelog" } 위와 같은 JSON을 파생해서 아래와 같이 setter가 없는 객체에 집어 넣고 싶은 경우가 있습니다. 파싱한 결

blog.benelog.net

 

Comments