Bagaimana cara menerima parameter Tanggal dalam permintaan GET ke Spring MVC Controller?


122

Saya memiliki permintaan GET yang mengirimkan tanggal dalam format YYYY-MM-DD ke Spring Controller. Kode pengontrol adalah sebagai berikut:

@RequestMapping(value="/fetch" , method=RequestMethod.GET)
    public @ResponseBody String fetchResult(@RequestParam("from") Date fromDate) {
        //Content goes here
    }

Permintaan dikirim dengan benar saat saya memeriksa dengan Firebug. Saya mendapatkan kesalahan:

Status HTTP 400: Permintaan yang dikirim oleh klien salah secara sintaksis.

Bagaimana saya bisa membuat pengontrol menerima format Tanggal ini? Tolong bantu. Apa yang saya lakukan salah?

Jawaban:


250

Oke, saya menyelesaikannya. Menulisnya untuk siapa saja yang mungkin lelah setelah seharian penuh coding non-stop & melewatkan hal konyol seperti itu.

@RequestMapping(value="/fetch" , method=RequestMethod.GET)
    public @ResponseBody String fetchResult(@RequestParam("from") @DateTimeFormat(pattern="yyyy-MM-dd") Date fromDate) {
        //Content goes here
    }

Ya, itu sederhana. Cukup tambahkan anotasi DateTimeFormat.


18
Saya akan menulis jawaban tetapi Anda mengalahkan saya. Anda juga dapat menggunakan @DateTimeFormat (iso = ISO.DATE), dengan format yang sama. BTW, jika Anda bisa, saya sarankan Anda menggunakan perpustakaan Joda DateTime. Spring mendukungnya dengan sangat baik.
— Luciano

Jawabannya umumnya ok, TAPI! Apakah ada cara untuk mengkonfigurasinya sebagai default untuk Spring? Agak berlebihan untuk memasang @DateTimeFormatsetiap pengontrol yang Anda miliki ...
— thorinkor

3
@Luciano tentu saja Anda dapat melakukan @DateTimeFormat (iso = ISO.DATE_TIME) juga
— kiedysktos

2
@thorinkor Dalam Spring Boot Anda dapat mengatur spring.mvc.date-formatatribut application.propertiesatau menambahkan kacang yang mengimplementasikan org.springframework.formatantarmuka ( org.springframework.format.datetime.DateFormattermungkin memperluas cara untuk pergi). Di non-Boot Spring Anda dapat @Overridemenggunakan addFormattersmetode WebMvcConfigurerAdapterdan menambahkan kacang yang menerapkan Formatter di sana.
— UTF_or_Death

10

Inilah yang saya lakukan untuk mendapatkan tanggal yang diformat dari ujung depan

  @RequestMapping(value = "/{dateString}", method = RequestMethod.GET)
  @ResponseBody
  public HttpStatus getSomething(@PathVariable @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) String dateString) {
   return OK;
  }

Anda bisa menggunakannya untuk mendapatkan apa yang Anda inginkan.


11
Tidak mengerti. Apa gunanya menambahkan @ DateTimeFormat ke @ PathVariable jika Anda menerima dateString sebagai String, bukan sebagai Date?
— Topan ILya

7

... atau Anda dapat melakukannya dengan cara yang benar dan memiliki aturan yang koheren untuk serialisasi / deserialisasi tanggal di seluruh aplikasi Anda. taruh ini di application.properties:

spring.mvc.date-format=yyyy-MM-dd

3

Solusi di bawah ini berfungsi sempurna untuk aplikasi boot musim semi.

Pengontrol:

@GetMapping("user/getAllInactiveUsers")
List<User> getAllInactiveUsers(@RequestParam("date") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") Date dateTime) {
    return userRepository.getAllInactiveUsers(dateTime);
}

Jadi di pemanggil (dalam kasus saya ini adalah fluks web), kita harus melewatkan waktu tanggal dalam format ( "yyyy-MM-dd HH: mm: ss" ) ini.

Sisi Penelepon:

public Flux<UserDto> getAllInactiveUsers(String dateTime) {
    Flux<UserDto> userDto = RegistryDBService.getDbWebClient(dbServiceUrl).get()
            .uri("/user/getAllInactiveUsers?date={dateTime}", dateTime).retrieve()
            .bodyToFlux(User.class).map(UserDto::of);
    return userDto;
}

Gudang:

@Query("SELECT u from User u  where u.validLoginDate < ?1 AND u.invalidLoginDate < ?1 and u.status!='LOCKED'")
List<User> getAllInactiveUsers(Date dateTime);

Bersulang!!


2

Jika Anda ingin menggunakan PathVariable, Anda dapat menggunakan metode contoh di bawah ini (semua metode adalah dan melakukan hal yang sama):

//You can consume the path .../users/added-since1/2019-04-25
@GetMapping("/users/added-since1/{since}")
public String userAddedSince1(@PathVariable("since") @DateTimeFormat(pattern = "yyyy-MM-dd") Date since) {
    return "Date: " + since.toString(); //The output is "Date: Thu Apr 25 00:00:00 COT 2019"
}

//You can consume the path .../users/added-since2/2019-04-25
@RequestMapping("/users/added-since2/{since}")
public String userAddedSince2(@PathVariable("since") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) Date since) {
    return "Date: " + since.toString(); //The output is "Date: Wed Apr 24 19:00:00 COT 2019"
}

//You can consume the path .../users/added-since3/2019-04-25
@RequestMapping("/users/added-since3/{since}")
public String userAddedSince3(@PathVariable("since") @DateTimeFormat(pattern = "yyyy-MM-dd") Date since) {
    return "Date: " + since.toString(); //The output is "Date: Thu Apr 25 00:00:00 COT 2019"
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.