Bekerja dengan Parameter Tarikh pada Musim Bunga

1. Pengenalan

Dalam tutorial ringkas ini, kita akan melihat bagaimana menerima parameter Date , LocalDate dan LocalDateTime dalam permintaan Spring REST, baik pada peringkat permintaan dan aplikasi.

2. Masalahnya

Mari pertimbangkan pengawal dengan tiga kaedah yang menerima parameter Date , LocalDate dan 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) { // ... } }

Semasa menghantar permintaan POST ke salah satu kaedah dengan parameter yang diformat sesuai dengan ISO 8601, kami akan mendapat pengecualian.

Contohnya, ketika mengirim "2018-10-22" ke titik akhir / tarikh kita akan mendapat ralat permintaan yang buruk dengan mesej yang serupa dengan ini:

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

Ini kerana Spring secara lalai tidak dapat menukar parameter String ke objek tarikh atau waktu.

3. Tukar Parameter Tarikh pada Tahap Permintaan

Salah satu cara untuk mengatasi masalah ini adalah dengan memberi keterangan parameter dengan anotasi @DateTimeFormat dan memberikan parameter corak pemformatan:

@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) { // ... } }

Dengan cara ini, Strings akan ditukar dengan betul menjadi objek tarikh, dengan syarat Strings diformat menggunakan format ISO 8601.

Kita juga boleh menggunakan corak penukaran kita sendiri. Kami hanya dapat memberikan parameter corak dalam anotasi @DateTimeFormat :

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

4. Tukar Parameter Tarikh di Peringkat Aplikasi

Cara lain untuk menangani penukaran objek tarikh dan waktu pada musim bunga adalah dengan menyediakan konfigurasi global. Dengan mengikuti dokumentasi rasmi kita harus memperluas konfigurasi WebMvcConfigurationSupport dan memperluas kaedah 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; } }

Pertama, kami membuat DefaultFormattingConversionService dengan parameter yang salah, yang bermaksud Spring tidak akan mendaftarkan format apa pun secara lalai.

Seterusnya, kita perlu mendaftarkan format khusus untuk parameter tarikh dan tarikh-masa. Kita perlu melakukannya dengan mendaftarkan dua pendaftar pemformatan tersuai. Yang pertama - DateTimeFormatterRegistar akan bertanggungjawab untuk menghuraikan yang LOCALDATE dan LocaDateTime objek. Yang kedua - DateFormattingRegistrar akan mengendalikan objek Date .

5. Ringkasan

Dalam artikel ini, kami telah belajar bagaimana menerima parameter tarikh dalam permintaan Spring MVC. Kami telah membahas cara melakukannya mengikut permintaan dan secara global.

Kami juga telah belajar bagaimana membuat corak pemformatan tarikh kita sendiri.

Seperti biasa semua kod sumber tersedia di GitHub.