티스토리 뷰
(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의 속성명과 생성자의 실제 파라미터 명이 다른 경우에는 사용하는 것이 부자연스럽습니다.
출처
'Web' 카테고리의 다른 글
SSR과 CSR (0) | 2022.05.04 |
---|---|
Maven과 Tomcat으로 웹 개발 환경 구축하기(+ IntelliJ) (0) | 2022.04.14 |
JPQL getResultList()과 getSingleResult() (0) | 2021.10.12 |
ControllerAdvice와 ExceptionHandler로 예외처리 (0) | 2021.09.13 |
Jackson과 Gson (Java에서 json 사용하기) (0) | 2021.09.09 |
Comments