Добавление модулей в ObjectMapper

Добавление модулей в 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 раз за сегодня)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *