Добавление модулей в 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()); } } |
(Просмотрено 793 раз, 1 раз за сегодня)