Входящий формат: 2018-06-06T13:19:53+00:00
Это странный формат.
Это формат ISO 8601 , который одобрен RFC 3339 и xkcd 1179 :
При получении значений в качестве параметров запроса должно работать следующее:
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
private LocalDate dateTime;
Поскольку 2018-06-06T13:19:53+00:00
представляет дату и время со смещением от UTC, лучше использовать OffsetDateTime
, а не LocalDateTime
:
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
private OffsetDateTime dateTime;
Просто убедитесь, что +
закодировано как %2B
.
С Джексоном вы можете добавить зависимость jackson-datatype-jsr310
в свое приложение. Этот модуль предоставит вам сериализаторы и десериализаторы для java.time
типов.
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>${jackson.version}</version>
</dependency>
А затем зарегистрируйте модуль JavaTimeModule
в своем ObjectMapper
:
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
Джексон будет заниматься сериализацией и десериализацией для вас.
Если вы по какой-то причине не заинтересованы в смещении от UTC и хотите продолжать использовать LocalDateTime
, вы можете расширить LocalDateTimeDeserializer
, предоставленные Джексоном и использовать пользовательский DateTimeFormatter
:
public class CustomLocalDateTimeDeserializer extends LocalDateTimeDeserializer {
public CustomLocalDateTimeDeserializer() {
super(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
}
}
Затем аннотируйте поле LocalDateTime
, как показано ниже:
@JsonDeserialize(using = CustomLocalDateTimeDeserializer.class)
private LocalDateTime dateTime;