Programming/Java

LocalDateTime Jackson 직렬화 오류, 두 가지 해결 방법

Jan92 2022. 6. 4. 22:04
반응형

Java 8, LocalDateTime Jackson Serializer Error 해결 방법

@AllArgsConstructor
@Setter
@Getter
public class Example {
    private LocalDateTime localDatetime;
}
Example example = new Example(LocalDateTime.now());

ObjectMapper objectMapper = new ObjectMapper();
try {
    String jsonStr = objectMapper.writeValueAsString(example);
} catch (JsonProcessingException e) {
    e.printStackTrace();
}

(오류 예시 코드)

 

 

LocalDateTime 형식의 데이터를 ObjectMapper의 writeValueAsString() 메서드를 통해 직렬화 하려고 했을 때, 아래와 같은 오류가 발생하였습니다.

 

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: ~ ["localDateTime"])

 

오류의 원인은 Java 8에서는 java.time.LoaclDateTime 형식의 날짜/시간 유형을 지원하지 않는다는 것인데요. 해결 방법으로 com.fastxml.jackson.datatype:jackson-datatype-jsr310을 추가하여 처리하도록 설정하라고 합니다.

 

 


 

 

Example example = new Example(LocalDateTime.now());

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

try {
    String jsonStr = objectMapper.writeValueAsString(example);
} catch (JsonProcessingException e) {
    e.printStackTrace();
}

해당 방법을 바로 코드로 살펴보면 다음과 같습니다.

 

JavaTimeModule는 jackson.datatype.jsr310 package에 속해있는 클래스이며, SerializationFeature.WRITE_DATES_AS_TIMESTAMPS 옵션을 사용하지 않도록 설정합니다.

 

{"localDateTime":"2022-06-04T21:49:26.923"}

 

해당 방법의 결과로 LocalDateTime 타입의 데이터가 정상적으로 직렬화되는 것을 볼 수 있으며, LocalDate와 LocalTime 타입도 해당 방법을 통해 오류 없이 직렬화를 할 수 있습니다.

 

 


 

public class CustomLocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {

    private static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss");

    @Override
    public void serialize(LocalDateTime localDateTime, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        jsonGenerator.writeString(formatter.format(localDateTime));
    }
}

(CustomLocalDateTimeSerializer Class)

 

Example example = new Example(LocalDateTime.now());

SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer(LocalDateTime.class, new CustomLocalDateTimeSerializer());

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(simpleModule);

try {
    String jsonStr = objectMapper.writeValueAsString(example);
}
...

또 하나의 방법은 다음과 같이 CustomLocalDateTimeSerializer 클래스를 직접 만들어서 적용하는 것입니다.

만약 이렇게 사용하게 될 경우 LocalDate, LocalTime 모두 각각 CustomSerializer 클래스를 만들어서 적용해줘야 하는 번거로움이 있을 수 있습니다.

 

 

 

< 참고 자료 >

 

GitHub - HomoEfficio/dev-tips: 개발하다 마주쳤던 작은 문제들과 해결 방법 정리

개발하다 마주쳤던 작은 문제들과 해결 방법 정리. Contribute to HomoEfficio/dev-tips development by creating an account on GitHub.

github.com

 

< 함께 보면 좋은 자료 >

 

날짜와 시간을 다루는 LocalDate, LocalTime, LocalDateTime (java.time 패키지) 기본 개념

Java 날짜와 시간을 나타내는 Calendar class [Java] 날짜와 시간을 나타내는 Calender class 날짜와 시간은 어떤 프로젝트에서든 뺄 수 없는 데이터입니다. 개발을 하며 앞으로 계속 사용될 날짜와 시간에

wildeveloperetrain.tistory.com

 

 

Java 날짜와 문자열 LocalDateTime, String 변환하기

'LocalDateTime to String, String to LocalDateTime' 자바에서는 기존의 Calendar 클래스와 Date 클래스의 불편한 점을 보안하기 위해 JDK1.8부터 java.time API를 도입하였습니다. java.time 패키지에는 날짜와..

wildeveloperetrain.tistory.com

반응형