[Spring] ObjectMapper LocalDateTime 역직렬화 오류

Allow·2024년 3월 28일
0

오류내용

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;
	}
profile
반갑습니다!

0개의 댓글