我可以对 Post 请求使用 @Requestparam 注解吗?

新手上路,请多包涵

我有这个控制器方法:

 @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 参数时,我得到一个更一般的错误,它会说它找不到第一个必需的参数(开始),而它实际上是与参数结束一起发送的,小时和用户名。

如何在 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– 参数 params 不是不正是我想的那样。它似乎被用作条件。如果一组参数匹配一个值,那么端点控制器方法将被激活。

原文由 Maurice 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 3.6k
2 个回答

你要求的是根本错误的。 POST 请求在正文有效载荷中发送数据,该有效载荷通过 @RequestBody 映射。 @RequestParam 用于通过 /url?start=foo 等URL参数映射数据。您要做的是使用 @RequestParam 来完成 @RequestBody 的工作。

REST 控制器的替代解决方案

  • 引入一个 DTO 类。这是最优选和最干净的方法。
  • 如果你真的想避免创建一个类,你可以使用 @RequestBody Map<String, String> payload 。请务必在您的请求标头中包含 'Content-Type': 'application/json'
  • 如果您真的想使用 @RequestParam ,请改为使用 GET 请求并通过 URL 参数发送您的数据。

MVC 控制器的替代解决方案

  • 引入一个 DTO 类并使用注释 @ModelAttribute
  • 如果将表单数据转换为 JSON,则可以使用 @RequestBody Map<String, String> payload 。为此,请参阅 此答案

无法将表单数据编码数据直接映射到 Map<String, String>

原文由 Sync 发布,翻译遵循 CC BY-SA 3.0 许可协议

好吧,我认为@Synch 的回答从根本上是错误的,而不是所问的问题。

  1. 首先,我在很多需要 GET 或 POST HTTP 消息的场景中使用 @RequestParam 我想说,它工作得很好;
  2. POST 消息的数据有效负载(正文),它被称为投票最多的答案(再次由@Synch)实际上是文本数据,它可以完全合法地是 paramname=paramvalue 键值映射类似(请参阅此处的 POST 消息正文类型);
  3. docs.spring.io ,Spring 文档的官方来源, 明确指出

在 Spring MVC 中,“请求参数”映射到多部分请求中的查询参数、表单数据和部分。

所以,我认为答案是肯定的,您可以使用 @RequestParam 注释和 @Controller 类方法的参数,只要该方法由 @RequestMapping -bc53- 请求映射你不期望对象,这是完全合法的,没有任何问题。

原文由 Giorgi Tsiklauri 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题