Spring boot Web Contorller 와 Jackson
.w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot construct instance of 'DTO'
라는 에러를 이번에 rest api를 구현하면서 만나게 되었다.
원인은 spring boot가 기본적으로 사용하는 json parser가 jackson 이여서 만나게된 문제(?)(사실 문제라기보단 내가 몰랐던거,,) 였는데 이를 하결하고 Jackson과 Gson의 차이를 명확히 하기 위해 이 포스팅을 남긴다.
아 위 문제를 해결하려면 각 dto마다 기본 생성자를 추가해주면 된다.
1. Jackson 과 Gson
Jackson과 Gson 모두 Java에 대한 Json 데이터 바인딩을 지원하는 완전한 라이브러리들이다.
데이터 바인딩
직렬화 (serializing, marshal : java 객체 -> json)
역직렬화 (deserializing, umarshal : json -> java 객체)
Jackson은 Spring 프레임 워크에 내장이 되어 있으나 Gson은 pom.xml 에 추가하거나 spring boot application.properties 에 추가하여 사용이 가능하다.
# Preferred JSON mapper to use for HTTP message conversion.
spring.http.converters.preferred-json-mapper=gson
또는
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>${gson.version}</version>
</dependency>
를 추가하여 사용이 가능하다.
Jackson의 직렬화
ObjectMapper mapper = new ObjectMapper();
String json Result = mapper.writeValueAsString(json 으로 바꾸고 싶은 java 객체);
Jackson의 역직렬화
String jsonInput = "json 데이터";
ObjectMapper mapper = new ObjectMapper();
Exmaple example = mapper.readValue(jsonIput, Example.class);
Gson의 직렬화
String jsonResult = new Gson().toJson(json으로 바꾸고싶은 java객체);
Gson의 역직렬화
String jsonInput = "json 데이터";
Example exam = new Gson().fromJson(jsonInput, Example.class);