Bekerja dengan Parameter Tanggal di Musim Semi

1. Perkenalan

Dalam tutorial singkat ini, kita akan melihat cara menerima parameter Date , LocalDate dan LocalDateTime dalam permintaan Spring REST, baik di tingkat permintaan dan aplikasi.

2. Masalah

Mari pertimbangkan pengontrol dengan tiga metode 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) { // ... } }

Saat mengirim permintaan POST ke salah satu metode tersebut dengan parameter yang diformat sesuai dengan ISO 8601, kami akan mendapatkan pengecualian.

Misalnya, saat mengirim "2018-10-22" ke / date endpoint kita akan mendapatkan error request yang buruk dengan pesan yang mirip 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 karena Spring secara default tidak dapat mengonversi parameter String ke objek tanggal atau waktu apa pun.

3. Ubah Parameter Tanggal pada Tingkat Permintaan

Salah satu cara untuk menangani masalah ini adalah dengan membuat anotasi parameter dengan anotasi @DateTimeFormat dan memberikan parameter pola 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, String akan dikonversi dengan benar ke objek tanggal, asalkan String diformat menggunakan format ISO 8601.

Kita juga bisa menggunakan pola konversi kita sendiri. Kami hanya dapat memberikan parameter pola dalam anotasi @DateTimeFormat :

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

4. Ubah Parameter Tanggal di Tingkat Aplikasi

Cara lain untuk menangani konversi objek tanggal dan waktu di Spring adalah menyediakan konfigurasi global. Dengan mengikuti dokumentasi resmi, kita harus memperluas konfigurasi WebMvcConfigurationSupport dan memperluas metode 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, kita membuat DefaultFormattingConversionService dengan parameter palsu, yang berarti Spring tidak akan mendaftarkan pemformat apa pun secara default.

Selanjutnya, kita perlu mendaftarkan format khusus kita untuk parameter tanggal dan waktu. Kita perlu melakukannya dengan mendaftarkan dua pendaftar pemformatan khusus. Yang pertama - DateTimeFormatterRegistar akan bertanggung jawab untuk mengurai objek LocalDate dan LocaDateTime . Yang kedua - DateFormattingRegistrar akan menangani objek Tanggal .

5. Ringkasan

Di artikel ini, kita telah mempelajari cara menerima parameter tanggal dalam permintaan MVC Spring. Kami telah membahas cara melakukannya sesuai permintaan dan secara global.

Kami juga telah mempelajari cara membuat pola pemformatan tanggal kami sendiri.

Seperti biasa, semua kode sumber tersedia di GitHub.