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?

LittleLebowski
sumber

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.

LittleLebowski
sumber
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.

AbdusSalam
sumber
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
Paul T
sumber
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!!

Aman Goel
sumber
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"
}
David Yesus
sumber