我有这个控制器方法:
@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参数时,我得到了一个更一般的错误,它将说它找不到第一个必需的参数(开始),而实际上它与参数end,hours和username一起发送。
@PostMapping
如何在Spring MVC中获取方法中的参数?
我在这篇文章中读到了@RequestParam只能用于get方法的内容,但是如果我删除@RequestParam并坚持使用@PostMapping批注的params参数,它仍然无法正常工作。我知道我可以使用,@RequestBody但我不想只为这四个参数创建一个类。谁能告诉我如何进行这项工作?
@RequestParam
@RequestBody
谢谢
编辑:我在这里阅读https://docs.spring.io/spring/docs/current/javadoc- api/org/springframework/web/bind/annotation/RequestMapping.html#params-参数params是’完全符合我的想法。它似乎用作条件。如果一组参数与值匹配,则将激活端点控制器方法。
您要求的是根本错误的。POST请求在主体有效负载中发送数据,该有效负载通过映射@RequestBody。@RequestParam用于通过URL参数(例如)映射数据/url?start=foo。您要尝试做的是@RequestParam用来完成工作@RequestBody。
/url?start=foo
@RequestBody Map<String, String> payload
'Content-Type': 'application/json'
@ModelAttribute
无法将表单数据编码数据直接映射到Map<String, String>。
Map<String, String>