LocalDate, LocalDateTime 역직렬화 실패

mynameisjaehoon·2023년 12월 23일
0
post-thumbnail

댓글 생성기능은 클라이언트가 댓글 작성 폼 JSON은 컨트롤러에 전달하면 댓글을 생성후 생성된 댓글정보를 담아 JSON으로 HTTP 바디에 담아 전달해준다.

이 기능의 테스트코드를 작성하기 위해서 MvcResult를 받고 응답데이터를 받아 바디에 있는 JSON을 객체로 만드는 역직렬화를 진행하였다. 그런데 Java8의 LocalDateTime을 역직렬화 할 수 없다는 에러가 발생하였다.

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Java 8 date/time type java.time.LocalDateTime not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling at …

컨트롤러가 응답하는 CreateCommentReponseDtoLocalDateTime 필드를 포함하고 있었고, 만들어진 JSON을 다시 역직렬화 하려고 하자 InvalidDefinitionException이 발생한 것이다.

이 문제를 해결하기 위해서는 Jackson이 자바 8부터 추가된 LocalDateTime, LocalDate 타입을 지원하기위한 모듈을 사용해야 한다.

https://github.com/FasterXML/jackson-modules-java8

해당 github에 사용하기 위한 방법이 나와있다.

모듈을 사용하기 위해서 maven이나 gradle dependencies를 추가해주어야한다.

<!-- MAVEN -->
<!--	Parameter names	-->
<dependency>
    <groupId>com.fasterxml.jackson.module</groupId>
    <artifactId>jackson-module-parameter-names</artifactId>
</dependency>

<!--	Java 8 Date/time	-->
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
</dependency>

<!--	Java 8 Datatypes	-->
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jdk8</artifactId>
</dependency>
// GRADLE
runtimeOnly group: 'com.fasterxml.jackson.module', name: 'jackson-modules-java8', version: '2.8.5', ext: 'pom'

문서에서 추천하는 방법을 사용해서 ObjectMapper에 원하는 모듈을 넣고 실행하면 LocalDateTime, LocalDate도 역직렬화 되서 정상적인 결과가 나오고, 테스트도 성공하는 것을 확인할 수 있습니다. 저는 registerModule 메서드를 활용하였습니다.

objectMapper = new ObjectMapper()
		.registerModule(new ParameterNamesModule())
		.registerModule(new Jdk8Module())
		.registerModule(new JavaTimeModule());

0개의 댓글