«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.Date, мы можем использовать аннотацию таким же образом:

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.Date или java.util.Calendar. Однако надежда есть, как мы скоро увидим.

4. Настройка ObjectMapper Джексона

Итак, если мы хотим использовать типы даты Java 8 и установить формат даты по умолчанию, нам нужно рассмотреть создание bean-компонента Jackson2ObjectMapperBuilderCustomizer:

@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)));
        };
    }

}

В приведенном выше примере показано как настроить формат по умолчанию в нашем приложении. Мы должны определить компонент и переопределить его метод настройки, чтобы установить желаемый формат.

Хотя этот подход может показаться немного громоздким, в нем хорошо то, что он работает как для Java 8, так и для устаревших типов даты.

5. Заключение

В этой статье мы рассмотрели несколько различных способов форматирования дат JSON в приложении Spring Boot.

Как всегда, исходный код примеров можно найти на GitHub.