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.
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
.
@RequestBody Map<String, String> payload
. Assurez-vous d'inclure 'Content-Type': 'application/json'
dans l'en-tête de votre demande.@RequestParam
, utilisez plutôt une requête GET et envoyez vos données via des paramètres d'URL.@ModelAttribute
.@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>
.
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