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 클래스를 만들어서 적용해줘야 하는 번거로움이 있을 수 있습니다.
< 참고 자료 >
< 함께 보면 좋은 자료 >
'Programming > Java' 카테고리의 다른 글
@MappedSuperclass 조금 다르게 사용해보기 (0) | 2022.07.18 |
---|---|
Java 클라이언트 요청 IP 가져오는 방법(HttpServletRequest) (0) | 2022.06.07 |
Java QR코드 생성 (Image 출력 및 파일저장) (5) | 2022.05.28 |
Java - Future Interface 비동기적 연산 작업을 위한 인터페이스 (2) | 2022.04.04 |
Java 주식 API (대신증권 사이보스 플러스) 연동하기 (1) | 2022.02.05 |