댓글 생성기능은 클라이언트가 댓글 작성 폼 JSON은 컨트롤러에 전달하면 댓글을 생성후 생성된 댓글정보를 담아 JSON으로 HTTP 바디에 담아 전달해준다.
이 기능의 테스트코드를 작성하기 위해서 MvcResult를 받고 응답데이터를 받아 바디에 있는 JSON을 객체로 만드는 역직렬화를 진행하였다. 그런데 Java8의 LocalDateTime
을 역직렬화 할 수 없다는 에러가 발생하였다.
com.fasterxml.jackson.databind.exc.InvalidDefinitionException
: Java 8 date/time typejava.time.LocalDateTime
not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling at …
컨트롤러가 응답하는 CreateCommentReponseDto
는 LocalDateTime
필드를 포함하고 있었고, 만들어진 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());