Mau*_*ice 13 java spring spring-mvc spring-web
我有这个控制器方法:
@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);
}
Run Code Online (Sandbox Code Playgroud)
但是,当我向此端点发送帖子请求时,我得到以下信息
"{"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"}"
Run Code Online (Sandbox Code Playgroud)
当我从@PostMapping
注释中删除params参数时,我得到一个更普遍的错误,它会说它找不到第一个必需参数(start),而它实际上是与参数end,hours和username一起发送的.
我在这篇文章中读过@RequestParam
只能用于获取方法的文章,但如果我删除@RequestParam
并坚持@PostMapping
注释的params参数,它仍然不起作用.我知道我可以使用,@RequestBody
但我不想为这4个参数创建一个类.谁能告诉我如何才能使这项工作?
谢谢
编辑:我在这里阅读https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/RequestMapping.html#params--论证params isn'正是我认为的那样.它似乎被用作条件.如果一组参数与值匹配,则将激活端点控制器方法.
Syn*_*ync 14
您要求的是根本错误的。POST请求在主体有效负载中发送数据,该有效负载通过映射@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
。为此,请参见此答案。无法将表单数据编码数据直接映射到Map<String, String>
。
好吧,我认为@Synch的回答从根本上是错误的,而不是所提出的问题。
@RequestParam
在很多情况下,我期望GET或POST HTTP消息,并且我想说,它工作得很好。paramname=paramvalue
完全相同地是键值映射(请参阅此处的POST消息正文类型) ;docs.spring.io
Spring文档的官方来源明确指出:
在Spring MVC中,“请求参数”映射到查询参数,表单数据和多部分请求中的零件。
因此,我认为答案是肯定的,您可以将@RequestParam
注释与@Controller
类的方法的参数一起使用,只要该方法是请求映射的,@RequestMapping
并且您不希望使用Object,那么这是完全合法的,并且没有任何问题。
归档时间: |
|
查看次数: |
24899 次 |
最近记录: |