web-dev-qa-db-fra.com

Puis-je utiliser l'annotation @Requestparam pour une demande de publication?

J'ai cette méthode de contrôleur:

@PostMapping(
        value = "/createleave",
        params = {"start","end","hours","username"})
public void createLeave(@RequestParam(value = "start") String start,
                        @RequestParam(value = "end") String end,
                        @RequestParam(value = "hours") String hours,
                        @RequestParam(value = "username") String username){
    System.out.println("Entering createLeave " + start + " " + end + " " + hours + " " + username);
    LeaveQuery newLeaveQuery = new LeaveQuery();
    Account account = accountRepository.findByUsername(username);
    newLeaveQuery.setAccount(account);
    newLeaveQuery.setStartDate(new Date(Long.parseLong(start)));
    newLeaveQuery.setEndDate(new Date(Long.parseLong(end)));
    newLeaveQuery.setTotalHours(Integer.parseInt(hours));
    leaveQueryRepository.save(newLeaveQuery);
}

Cependant, lorsque j'envoie une demande de publication à ce noeud final, le message suivant s'affiche: 

"{"timestamp":1511444885321,"status":400,"error":"Bad Request","exception":"org.springframework.web.bind.UnsatisfiedServletRequestParameterException","message":"Parameter conditions \"start, end, hours, username\" not met for actual request parameters: ","path":"/api/createleave"}"

Lorsque je supprime l'argument params de l'annotation @PostMapping, une erreur plus générale se produit, elle indique qu'il ne trouve pas le premier paramètre requis (début), alors qu'il est en train d'être envoyé avec les paramètres end, hours et username.

Comment obtenir param en méthode post-printemps MVC?

J'ai lu dans cet article que @RequestParam ne peut être utilisé que pour les méthodes get, mais si je supprime @RequestParam et me tiens à l'argument params de l'annotation @PostMapping, il ne fonctionne toujours pas. Je sais que je peux utiliser @RequestBody mais je ne veux pas créer de classe uniquement pour ces 4 paramètres. Quelqu'un peut-il me dire comment je peux faire ce travail? 

Je vous remercie

EDIT: je lis ici https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/RequestMapping.html#params-- que le argument params n'est pas exactement ce que je pensais. Il semble être utilisé comme condition. Si un ensemble de paramètres correspond à une valeur, la méthode du contrôleur de point final sera activée.

5
Maurice

Ce que vous demandez est fondamentalement faux. POST request envoie des données dans une charge utile corporelle mappée via @RequestBody. @RequestParam est utilisé pour mapper les données via les paramètres d'URL tels que /url?start=foo. Ce que vous essayez d’utiliser, c’est d’utiliser @RequestParam pour exécuter le travail de @RequestBody.

Solutions alternatives pour les contrôleurs REST

  • Introduisez une classe DTO. C'est la méthode la plus préférée et la plus propre.
  • Si vous voulez vraiment éviter de créer une classe, vous pouvez utiliser @RequestBody Map<String, String> payload. Assurez-vous d'inclure 'Content-Type': 'application/json' dans l'en-tête de votre demande.
  • Si vous voulez vraiment utiliser @RequestParam, utilisez plutôt une requête GET et envoyez vos données via des paramètres d'URL.

Solutions alternatives pour les contrôleurs MVC

  • Introduisez une classe DTO et utilisez-la avec l'annotation @ModelAttribute.
  • Si vous transformez les données de formulaire en JSON, vous pouvez utiliser @RequestBody Map<String, String> payload. Pour ce faire, veuillez consulter cette réponse .

Il n'est pas possible de mapper directement les données codées des données de formulaire sur un Map<String, String>.

3
Synch

Vous devez utiliser @RequestBody au lieu d'utiliser @RequestParam Et vous devez fournir l'objet entier comme corps de requête @RequestParam est destiné à GET et non à la méthode POST

vous pouvez faire quelque chose comme public saveUser(@RequestBody User user) { do something with user }

et il sera mappé en tant qu'objet utilisateur par exemple

1
Nenad Jovicic