Рубрики
Без рубрики

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

Узнайте, как работать с параметрами Даты в весеннем MVC

Автор оригинала: baeldung.

1. Введение

В этом коротком учебнике мы посмотрим, как принять Дата , Местное и Местное время параметры в запросах Spring REST, как на уровне запроса, так и на уровне приложения.

2. Проблема

Рассмотрим контроллер с тремя методами, которые принимают Дата , Местное и Местное время Параметры:

@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” в /Дата конечная точка мы получим ошибку плохой запрос с сообщением, похожим на это:

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

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

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. Преобразование параметров даты на уровне приложения

Еще один способ обработки преобразования объектов даты и времени весной заключается в предоставлении глобальной конфигурации. Следуя официальная документация мы должны расширить 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;
    }
}

Во-первых, мы создаем По умолчаниюФорматингКонверсияСервис с ложным параметром, что означает, что Spring не будет регистрировать форматировщики по умолчанию.

Далее, мы должны зарегистрировать наши пользовательские форматы для параметров даты и даты времени. Мы должны сделать это, зарегистрировав два пользовательских регистраторов форматирования. Первый – ДатаTimeFormatterRegistar будет отвечать за разбор Местное и ЛокаДатТайм Объектов. Второй – ДатаФорматированиеРегистрация будет обрабатывать Дата объект.

5. Настройка даты-времени в файле свойств

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

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

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

spring.mvc.format.date-time=iso

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

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

6. Резюме

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

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

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