Spring MVC Controller'a GET talebinde Tarih parametreleri nasıl kabul edilir?


122

Spring Controller'a YYYY-AA-GG formatında bir tarih gönderen bir GET isteğim var. Denetleyici kodu aşağıdaki gibidir:

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

Firebug ile kontrol ederken istek doğru şekilde gönderildi. Şu hatayı alıyorum:

HTTP Durumu 400: İstemci tarafından gönderilen istek sözdizimsel olarak yanlıştı.

Denetleyicinin bu Tarih biçimini kabul etmesini nasıl sağlayabilirim? Lütfen yardım et. Neyi yanlış yapıyorum?

Yanıtlar:


250

Tamam, çözdüm. Kesintisiz kodlamayla geçen bir günden sonra yorgun olabilecek ve böyle aptalca bir şeyi özleyen herkes için yazmak.

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

Evet, çok basit. DateTimeFormat ek açıklamasını eklemeniz yeterlidir.


18
Cevap yazacaktım ama sen beni yendin. Aynı format olan @DateTimeFormat (iso = ISO.DATE) da kullanabilirsiniz. BTW, yapabilirseniz Joda DateTime kütüphanesini kullanmanızı öneririm. Bahar bunu çok iyi destekliyor.
Luciano

Cevap genellikle tamam, AMA! Spring'e varsayılan olarak yapılandırmanın bir yolu var mı? Sahip olduğunuz @DateTimeFormather kumandayı
takmak

3
@Luciano tabii ki @DateTimeFormat (iso = ISO.DATE_TIME) da yapabilirsiniz
kiedysktos

2
@thorinkor Spring Boot'da spring.mvc.date-formatözniteliği ayarlayabilir application.propertiesveya org.springframework.formatarabirimi uygulayan fasulye ekleyebilirsiniz (genişletme org.springframework.format.datetime.DateFormattermuhtemelen gitmek için yoldur). Olmayan Boot baharında yapabilirsiniz yöntem ve Biçimlendirici-uygulayıcı fasulye orada ekleyin. @OverrideaddFormattersWebMvcConfigurerAdapter
UTF_or_Death

10

Ön uçtan biçimlendirilmiş tarih almak için yaptığım şey buydu

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

İstediğini elde etmek için kullanabilirsin.


11
Anlamadım. DateString'i Date olarak değil, String olarak alırsanız @ DateTimeFormat'ı @ PathVariable'a eklemenin anlamı nedir?
ILya Cyclone

7

... ya da bunu doğru şekilde yapabilir ve tüm uygulamanızda tarihlerin serileştirilmesi / seriden çıkarılması için tutarlı bir kurala sahip olabilirsiniz. bunu application.properties içine koyun:

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

Java 8 Tarih türleri ile çalışmaz.
Dennis

3

Aşağıdaki çözüm, yay önyükleme uygulaması için mükemmel bir şekilde çalışır.

Denetleyici:

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

Bu yüzden, arayan kişide (benim durumumda bir ağ akışı), tarih saatini bu ( "yyyy-MM-gg HH: mm: ss" ) biçiminde geçirmemiz gerekir .

Arayan Taraf:

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;
}

Depo:

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

Alkış !!


2

Bir PathVariable kullanmak istiyorsanız, aşağıdaki örnek bir yöntemi kullanabilirsiniz (tüm yöntemler aynıdır ve aynı şeyi yapar):

//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"
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.