我有这个控制器方法:
@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);
}
但是,当我向此端点发送发布请求时,我得到以下信息
"{"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"}"
当我从 @PostMapping
注释中删除 params 参数时,我得到一个更一般的错误,它会说它找不到第一个必需的参数(开始),而它实际上是与参数结束一起发送的,小时和用户名。
我在这篇文章中读到 @RequestParam
只能用于 get 方法,但如果我删除 @RequestParam
并坚持使用 @PostMapping
注释的 params 参数它仍然不起作用。我知道我可以使用 @RequestBody
但我不想只为这 4 个参数创建一个类。谁能告诉我如何进行这项工作?
谢谢
编辑:我在这里阅读 https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/RequestMapping.html#params– 参数 params 不是不正是我想的那样。它似乎被用作条件。如果一组参数匹配一个值,那么端点控制器方法将被激活。
原文由 Maurice 发布,翻译遵循 CC BY-SA 4.0 许可协议
你要求的是根本错误的。 POST 请求在正文有效载荷中发送数据,该有效载荷通过
@RequestBody
映射。@RequestParam
用于通过/url?start=foo
等URL参数映射数据。您要做的是使用@RequestParam
来完成@RequestBody
的工作。REST 控制器的替代解决方案
@RequestBody Map<String, String> payload
。请务必在您的请求标头中包含'Content-Type': 'application/json'
。@RequestParam
,请改为使用 GET 请求并通过 URL 参数发送您的数据。MVC 控制器的替代解决方案
@ModelAttribute
。@RequestBody Map<String, String> payload
。为此,请参阅 此答案。无法将表单数据编码数据直接映射到
Map<String, String>
。