Форматирование LocalDateTime в "yyyy-MM-dd" в Spring Boot
Быстрый ответ
Для корректной сериализации LocalDateTime
в Spring Boot необходимо добавить аннотацию @JsonFormat
к соответствующим полям модели и задать нужный шаблон формата. Для формата "год-месяц-день час:минута:секунда" применяется шаблон @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
. Для совместимости вашего кода с API для работы с датой и временем Java 8 убедитесь, что модуль jackson-datatype-jsr310
присутствует в classpath вашего проекта.
import com.fasterxml.jackson.annotation.JsonFormat;
import java.time.LocalDateTime;
public class SampleModel {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime dateTime;
// ... геттеры и сеттеры ...
}
Добавьте указанную ниже зависимость в файл pom.xml
:
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.9.0</version> <!-- Выберите версию, подходящую проекту -->
</dependency>
Для предотвращения преобразования ваших дат в массивы чисел, добавьте следующую строку в application.properties
:
spring.jackson.serialization.write_dates_as_timestamps=false
Этот параметр гарантирует, что LocalDateTime
в JSON-выводе будет представлен в корректном формате в Spring Boot 2.x без дополнительных настроек.
От нуля к герою: Продвинутая настройка
Глобальное задание форматов даты и времени
Если вам требуется единый формат даты и времени для всех полей LocalDateTime
, можно настроить ObjectMapper
в классе конфигурации:
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
@Configuration
public class JacksonConfig {
@Bean
public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
return builder
.serializers(new LocalDateTimeSerializer())
.deserializers(new LocalDateTimeDeserializer())
.featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
.build();
}
}
Индивидуальная стратегия форматирования даты и времени
При необходимости индивидуальных сериализации и десериализации, вы можете реализовать LocalDateTimeSerializer
и LocalDateTimeDeserializer
.
Пример для сериализации:
public class CustomLocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {
private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
@Override
public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeString(value.format(formatter));
}
}
Пример для десериализации:
public class CustomLocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {
private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
@Override
public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
return LocalDateTime.parse(p.getValueAsString(), formatter);
}
}
Совместимость – залог гладкой разработки
Убедитесь в совместимости версии модуля jackson-datatype-jsr310
с вашей версией Spring Boot, чтобы избежать проблем при обновлениях Spring Boot.
Разрешение конфликтов аннотаций
Понимайте контексты применения аннотаций @JsonFormat
и @DateTimeFormat
. @DateTimeFormat
удобна для привязки LocalDate
в HTTP-запросах, в то время как @JsonFormat
используется для JSON-сериализации и десериализации.
Визуализация
Вот так LocalDateTime
из Java 8 преобразуется в JSON-формат в Spring Boot:
Java LocalDateTime (🚂) => Станция Spring Boot (🌐)
На этом пути вы будете использовать индивидуальные сериализаторы:
@JsonSerialize(using = LocalDateTimeSerializer.class)
И придёте к нужному формату:
"departureTime": "2023-04-05T14:30:00"
Хорошее путешествие по долинам Spring Boot не может быть скучным.
Разгадка тайны сериализации
Если вы запутались в сериализации LocalDateTime
, проверьте следующее:
- Версию зависимости, чтобы быть в курсе обновлений.
- Аннотации на предмет возможных конфликтов их использования.
- ObjectMapper на правильность настройки и отсутствие активации
WRITE_DATES_AS_TIMESTAMPS
.
Мастерство надёжной конфигурации
Для стабильной и гибкой конфигурации следует:
- Обновлять зависимости и версию Spring Boot.
- Использовать глобальные настройки в
application.properties
или с помощью бинаObjectMapper
. - Применять аннотации для специальных полей с учетом их основной функциональности.
Расширяйте свои горизонты обращения с датой и временем
Несколько советов по работе с LocalDateTime
в Java 8 и Spring Boot:
- Учитывайте часовые пояса.
- Изучайте различные классы даты и времени вроде
ZonedDateTime
иOffsetDateTime
. - Разрабатывайте с ориентацией на тестирование: пусть ваши интеграционные и модульные тесты проверяют форматирование даты и времени.
Полезные материалы
- Официальная документация Spring Boot – подробное руководство по работе с JSON в Spring Boot.
- Как сохранить LocalDate и LocalDateTime с JPA 2.1 – статья рассказывает о работе с JPA и Date-Time API Java 8.
- Stack Overflow: Настройка маппинга JSON используя Jackson для LocalDate – сообщество подтверждает решения по настройке сериализации LocalDate.