Spring에서 ObjectMapper로 객체를 JsonString으로 변환하는 도중 오류가 발생했다.
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 (through reference chain: ...)
해당 오류는 Java8에 추가된 LocalDateTime, DateTime과 같은 날짜/시간 타입이 Jackson library에 지원되지 않아 발생하는 오류이다.
build.gradle
파일에 jackson-datatype-jsr310
의존성을 추가해야 한다.
(스프링 부트 2.0부터는 기본으로 포함되어 있기 때문에 스프링 부트 2.0 이상을 사용하고 있다면 추가하지 않아도 된다.)
dependencies {
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310'
...
아래 코드와 같이 JavaTimeModule
이 포함된 ObjectMapper
를 Bean으로 등록하고 사용하면 된다.
@Configuration
public class ModuleConfig {
@Bean
public ObjectMapper objectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());
return objectMapper;
}
}
그런데 LocalDateTime을 String으로 파싱했을 때 모양이 영 마음에 들지 않는다.
..."createDateTime":[2024,3,13,11,6,17,755809000]}
아래와 같이 JavaTimeModule을 수정하면 원하는 포멧으로 사용할 수 있다.
MAPPER.registerModule(getJavaTimeModule());
private static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss.SSSSSS";
private static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
private static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";
/**
* Could not read JSON: Java 8 date/time type `java.time.LocalDate` not supported by default: add
* Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling 관련 오류 대응
*/
private static JavaTimeModule getJavaTimeModule() {
var module = new JavaTimeModule();
module.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(
DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)));
module.addSerializer(LocalDate.class,
new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)));
module.addSerializer(LocalTime.class,
new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));
module.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(
DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)));
module.addDeserializer(LocalDate.class,
new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)));
module.addDeserializer(LocalTime.class,
new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));
return module;
}