1. Обзор
В этом уроке мы покажем, как форматировать поля даты JSON в приложении Spring Boot.
Мы рассмотрим различные способы форматирования дат с помощью Jackson , который используется Spring Boot в качестве процессора JSON по умолчанию.
2.Использование @JsonFormat в поле даты
2.1. Настройка формата
Мы можем использовать @JsonFormat аннотация для форматирования определенного поля :
public class Contact { // other fields @JsonFormat(pattern="yyyy-MM-dd") private LocalDate birthday; @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") private LocalDateTime lastUpdate; // standard getters and setters }
В поле день рождения мы используем шаблон, который отображает только дату, в то время как в поле LastUpdate мы также включаем время.
Мы использовали типы дат Java 8 , которые очень удобны для работы с временными типами. Конечно, если нам нужно использовать устаревшие типы, такие как java.util.Дата, мы можем использовать аннотацию таким же образом:
public class ContactWithJavaUtilDate { // other fields @JsonFormat(pattern="yyyy-MM-dd") private Date birthday; @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") private Date lastUpdate; // standard getters and setters }
Наконец, давайте взглянем на выходные данные, отображаемые с помощью @JsonFormat с заданным форматом даты:
{ "birthday": "2019-02-03", "lastUpdate": "2019-02-03 10:08:02" }
Как мы видим, используя @JsonFormat аннотация – отличный способ отформатировать конкретное поле даты.
Однако мы должны использовать его только тогда, когда нам нужно конкретное форматирование полей. Если мы хотим иметь общий формат для всех дат в нашем приложении, есть лучший способ добиться этого, как мы увидим позже.
2.2. Установка часового пояса
Кроме того, если нам нужно использовать определенный часовой пояс, мы можем установить атрибут часовой пояс @ JsonFormat:
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="Europe/Zagreb") private LocalDateTime lastUpdate;
Нам не нужно использовать его, если тип уже содержит часовой пояс, например, с java.time.ZonedDateTime.
3. Настройка формата по умолчанию
И хотя @JsonFormat сам по себе является мощным, жесткое кодирование формата и часового пояса может укусить нас в будущем.
Если мы хотим настроить формат по умолчанию для всех дат в нашем приложении, более гибкий способ-настроить его в application.properties :
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
И если мы хотим использовать определенный часовой пояс в наших датах JSON, для этого также есть свойство:
spring.jackson.time-zone=Europe/Zagreb
Хотя установка формата по умолчанию, подобного этому, довольно удобна и проста, у этого подхода есть недостаток. К сожалению, он не работает с типами даты Java 8 , такими как LocalDate и LocalDateTime – мы можем использовать его только для форматирования полей типа java.util.Дата или java.util.Календарь . Однако, как мы скоро увидим, надежда есть.
4. Настройка ObjectMapper Джексона
Итак, если мы хотим использовать типы дат Java 8 и установить формат даты по умолчанию, то нам нужно посмотреть на создание Jackson2ObjectMapperBuilderCustomizer bean:
@Configuration public class ContactAppConfig { private static final String dateFormat = "yyyy-MM-dd"; private static final String dateTimeFormat = "yyyy-MM-dd HH:mm:ss"; @Bean public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() { return builder -> { builder.simpleDateFormat(dateTimeFormat); builder.serializers(new LocalDateSerializer(DateTimeFormatter.ofPattern(dateFormat))); builder.serializers(new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(dateTimeFormat))); }; } }
В приведенном выше примере показано, как настроить формат по умолчанию в нашем приложении. Мы должны определить компонент и переопределить его метод customize , чтобы установить нужный формат.
Хотя этот подход может показаться немного громоздким, самое приятное в нем то, что он работает как для Java 8, так и для устаревших типов дат.
5. Заключение
В этой статье мы рассмотрели несколько различных способов форматирования дат JSON в приложении Spring Boot.
Как всегда, мы можем найти исходный код для примеров на GitHub .