Перейти к основному содержимому

Работа с параметрами даты в Spring

· 3 мин. чтения

1. Введение

В этом кратком руководстве мы узнаем, как принимать параметры Date , LocalDate и LocalDateTime в запросах Spring REST как на уровне запроса, так и на уровне приложения.

2. Проблема

Рассмотрим контроллер с тремя методами, который принимает параметры Date , LocalDate и LocalDateTime :

@RestController
public class DateTimeController {

@PostMapping("/date")
public void date(@RequestParam("date") Date date) {
// ...
}

@PostMapping("/localdate")
public void localDate(@RequestParam("localDate") LocalDate localDate) {
// ...
}

@PostMapping("/localdatetime")
public void dateTime(@RequestParam("localDateTime") LocalDateTime localDateTime) {
// ...
}
}

При отправке запроса POST на любой из этих методов с параметром, отформатированным в соответствии с ISO 8601, мы получим исключение.

Например, при отправке «2018-10-22» в конечную точку /date мы получим ошибку неверного запроса с сообщением, подобным этому:

Failed to convert value of type 'java.lang.String' to required type 'java.time.LocalDate'; 
nested exception is org.springframework.core.convert.ConversionFailedException.

Это связано с тем, что по умолчанию Spring не может преобразовать параметры String в любой объект даты или времени.

3. Преобразование параметров даты на уровне запроса

Один из способов решения этой проблемы — аннотировать параметры аннотацией @DateTimeFormat и предоставить параметр шаблона форматирования:

@RestController
public class DateTimeController {

@PostMapping("/date")
public void date(@RequestParam("date")
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE) Date date) {
// ...
}

@PostMapping("/local-date")
public void localDate(@RequestParam("localDate")
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate localDate) {
// ...
}

@PostMapping("/local-date-time")
public void dateTime(@RequestParam("localDateTime")
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime localDateTime) {
// ...
}
}

Таким образом, строки будут правильно преобразованы в объекты даты, при условии, что строки отформатированы с использованием формата ISO 8601.

Мы также можем использовать наши собственные шаблоны преобразования, указав параметр шаблона в аннотации @DateTimeFormat :

@PostMapping("/date")
public void date(@RequestParam("date")
@DateTimeFormat(pattern = "dd.MM.yyyy") Date date) {
// ...
}

4. Преобразование параметров даты на уровне приложения

Другой способ обработки преобразования объекта даты и времени в Spring — предоставить глобальную конфигурацию. Следуя официальной документации , мы должны расширить конфигурацию WebMvcConfigurationSupport и ее метод mvcConversionService :

@Configuration
public class DateTimeConfig extends WebMvcConfigurationSupport {

@Bean
@Override
public FormattingConversionService mvcConversionService() {
DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService(false);

DateTimeFormatterRegistrar dateTimeRegistrar = new DateTimeFormatterRegistrar();
dateTimeRegistrar.setDateFormatter(DateTimeFormatter.ofPattern("dd.MM.yyyy"));
dateTimeRegistrar.setDateTimeFormatter(DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss"));
dateTimeRegistrar.registerFormatters(conversionService);

DateFormatterRegistrar dateRegistrar = new DateFormatterRegistrar();
dateRegistrar.setFormatter(new DateFormatter("dd.MM.yyyy"));
dateRegistrar.registerFormatters(conversionService);

return conversionService;
}
}

Во- первых, мы создаем DefaultFormattingConversionService с параметром false, что означает, что Spring по умолчанию не будет регистрировать никаких средств форматирования.

Затем нам нужно зарегистрировать наши пользовательские форматы для параметров даты и даты и времени. Мы делаем это, регистрируя два пользовательских регистратора форматирования. Первый, DateTimeFormatterRegistar, будет отвечать за разбор объектов LocalDate и LocaDateTime . Второй, DateFormattingRegistrar, будет обрабатывать объект Date .

5. Настройте дату и время в файле свойств

Spring также дает нам возможность устанавливать глобальные форматы даты и времени через файл свойств приложения. Существует три отдельных параметра для даты, даты и времени и формата времени:

spring.mvc.format.date=yyyy-MM-dd
spring.mvc.format.date-time=yyyy-MM-dd HH:mm:ss
spring.mvc.format.time=HH:mm:ss

Все эти параметры можно заменить значением iso . Например, установив параметр даты и времени как:

spring.mvc.format.date-time=iso

будет равно форматированию ISO-8601:

spring.mvc.format.date-time=yyyy-MM-dd HH:mm:ss

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

В этой статье мы узнали, как принимать параметры даты в запросах Spring MVC. Мы обсудили, как это сделать для каждого запроса и глобально.

Мы также узнали, как создавать собственные шаблоны форматирования даты.

Как всегда, весь исходный код доступен на GitHub .