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 .