Добавление модулей в ObjectMapper
Часто бывают проблемы с десериализацией дат из строки в, например, LocalDateTime. Порой это выглядит так:
Cannot deserialize value of type 'java.time.LocalDateTime' from String
Есть несколько способов решить эту проблему. Один из них е использование аннотации @JsonFormat над нужным полем в dto
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime inputTimestamp;
Но бывают случаи, когда такое решение не приемлемо. Однако, есть ещё способ — кастомизация самого ObjectMapper’а. Я имею в виду про добавление модулей для сериализации/десериализации. Например, добавление модуля поддержки jsr310:
ObjectMapper om = new ObjectMapper();
om.registerModule(new com.fasterxml.jackson.datatype.jsr310.JavaTimeModule());
Или добавление модуля поддержки joda:
ObjectMapper om = new ObjectMapper();
om.registerModule(new com.fasterxml.jackson.datatype.joda.JodaModule());
Наряду с этим, есть возможность писать собственные модули для сериализации/десериализации чего угодно.
Не отходя от темы дат, приведу пример десериализации даты, представленной в любом из ожидаемых форматов:
ObjectMapper objectMapper = new ObjectMapper();
SimpleModule myModule = new com.fasterxml.jackson.databind.module.SimpleModule();
myModule.addDeserializer(LocalDate.class, new MyLocalDateDeserializer());
myModule.addDeserializer(LocalDateTime.class, new MyLocalDateTimeDeserializer());
objectMapper.registerModule(module);
где классы выглядят так:
public class MyLocalDateDeserializer extends JsonDeserializer<LocalDate> {
private static final DateTimeFormatter JSON_DATE_FORMATTER =
new DateTimeFormatterBuilder()
.append(null, new DateTimeParser[]{
DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ssZ").getParser(),
DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss").getParser(),
DateTimeFormat.forPattern("yyyy-MM-dd").getParser()
})
.toFormatter();
@Override
public LocalDate deserialize(
JsonParser jsonParser,
DeserializationContext deserializationContext
) throws IOException {
return JSON_DATE_FORMATTER.parseLocalDate(jsonParser.getText());
}
}
public class MyLocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {
private static final DateTimeFormatter JSON_DATE_FORMATTER =
new DateTimeFormatterBuilder()
.append(null, new DateTimeParser[]{
DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.sssZ").getParser(),
DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ssZ").getParser(),
DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss").getParser(),
DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss").getParser()
})
.toFormatter();
@Override
public LocalDateTime deserialize(
JsonParser jsonParser,
DeserializationContext deserializationContext
) throws IOException {
return JSON_DATE_FORMATTER.parseLocalDateTime(jsonParser.getText());
}
}
(Просмотрено 701 раз, 1 раз за сегодня)