我有这个控制器方法:
@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参数时,我得到一个更一般的错误,它会说它找不到第一个必需参数(start),而它实际上是与参数end,hours和username一起发送的。
how to get param in method post spring mvc?
我在这篇文章中读到@RequestParam
只能用于get方法,但是如果我删除@RequestParam
并坚持使用@PostMapping
注释的params参数,它仍然无效。我知道我可以使用@RequestBody
,但我不想为这4个参数创建一个类。谁能告诉我如何才能使这项工作?
谢谢
编辑:我在这里读https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/RequestMapping.html#params--,论证参数并不完全是我认为的那样。它似乎被用作条件。如果一组参数与值匹配,则将激活端点控制器方法。
你所要求的是根本错误的。 POST请求在body有效负载中发送数据,该有效负载通过@RequestBody
映射。 @RequestParam
用于通过URL参数(如/url?start=foo
)映射数据。你要做的是使用@RequestParam
来完成@RequestBody
的工作。
@RequestBody Map<String, String> payload
。请务必在请求标头中包含'Content-Type': 'application/json'
。@RequestParam
,请改用GET请求并通过URL参数发送数据。@ModelAttribute
一起使用。@RequestBody Map<String, String> payload
。要做到这一点,请参阅this answer。无法将表单数据编码数据直接映射到Map<String, String>
。
好吧,我认为@Synch的答案根本就是错误的,而不是被问到的问题。
@RequestParam
期待GET或POST HTTP消息,我想说,它工作得很好;paramname=paramvalue
键值映射(参见POST Message Body types here);docs.spring.io
,Spring Documentation的官方来源,clearly states,:
在Spring MVC中,“请求参数”映射到多部分请求中的查询参数,表单数据和部件。所以,我认为答案是肯定的,你可以在@RequestParam
类的方法参数中使用@Controller
注释,只要该方法由@RequestMapping
进行请求映射并且你不期望Object,这是完全合法的并且它没有任何问题。
您应该使用@RequestBody
而不是使用@RequestParam
并且您应该提供整个对象作为请求的主体@RequestParam
用于GET,而不是POST方法
你可以做像public saveUser(@RequestBody User user) { do something with user }
这样的事情
例如,它将被映射为User对象
@PostMapping("/createleave")
public void createLeave(@RequestParam Map<String, String> requestParams){
String start = requestParams.get("start");
String end= requestParams.get("end");
String hours= requestParams.get("hours");
String username = requestParams.get("username");
System.out.println("Entering createLeave " + start + " " + end + " " + hours + " " + username);
}
这适用于multipart / form-data enctype post请求。