Работа с параметри на дата през пролетта

1. Въведение

В този кратък урок ще разгледаме как да приемем параметрите Date , LocalDate и LocalDateTime в пролетните 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. Преобразувайте параметрите на дата на ниво приложение

Друг начин за справяне с преобразуването на обекти с дата и час през пролетта е да се осигури глобална конфигурация. Следвайки официалната документация, ние трябва да разширим конфигурацията 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 с фалшив параметър, което означава, че Spring няма да регистрира никакви форматиращи устройства по подразбиране.

След това трябва да регистрираме нашите персонализирани формати за параметри за дата и дата-час. Трябва да го направим, като регистрираме два персонални регистратора за форматиране. Първият - DateTimeFormatterRegistar ще отговаря за анализирането на обектите LocalDate и LocaDateTime . Вторият - DateFormattingRegistrar ще обработва обекта Date .

5. Обобщение

В тази статия научихме как да приемаме параметрите за дата в пролетните заявки за MVC. Покрихме как да го направим при заявка и в световен мащаб.

Също така научихме как да създаваме свои собствени модели за форматиране на дати.

Както винаги целият изходен код е достъпен в GitHub.