web-dev-qa-db-fra.com

Comment accepter les paramètres de date dans une requête GET adressée au contrôleur Spring MVC?

J'ai une demande GET qui envoie une date au format AAAA-MM-JJ à un contrôleur Spring. Le code du contrôleur est le suivant:

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

La demande est envoyée correctement lorsque je vérifie auprès de Firebug. Je reçois l'erreur:

État HTTP 400: la requête envoyée par le client était syntaxiquement incorrecte.

Comment puis-je faire en sorte que le contrôleur accepte ce format de date? S'il vous plaît aider. Qu'est-ce que je fais mal?

111
LittleLebowski

Ok, je l'ai résolu. Ecrivez-le pour tous ceux qui pourraient être fatigués après une journée complète de codage & rater une chose aussi stupide.

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

Oui, c'est simple Ajoutez simplement l'annotation DateTimeFormat.

228
LittleLebowski

... ou vous pouvez le faire correctement et définir une règle cohérente pour la sérialisation/désérialisation des dates dans l'ensemble de votre application. mettez ceci dans application.properties:

spring.mvc.date-format=yyyy-MM-dd
5
Paul T

C’est ce que j’ai fait pour obtenir une date formatée à partir du front-end

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

Vous pouvez l'utiliser pour obtenir ce que vous voulez.

5
AbdusSalam

Si vous souhaitez utiliser une variable PathVariable, vous pouvez utiliser un exemple de méthode ci-dessous (toutes les méthodes le sont et font la même chose):

//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"
}
0
David Jesus