首页 > 解决方案 > 如何在 Spring 后端获取可变的 HTML 表单值(POST)

问题描述

我对 Java 和 Spring 框架还很陌生,这可能很容易解决,但我找不到任何解决这个问题的方法,其他解决方案也不适合我的问题。

我想实现一个动态表单,用户在其中插入多个电子邮件地址来发送邀请。这种形式可以通过JS动态扩展。每次单击都会在我的表单中添加另一个输入字段。所以现在我有可变数量的值要发送到我的 Spring 后端。我在想我必须使用 @ResponseBody 和 Map 将 POST 值存储在其中,然后对其进行迭代并(例如)将它们复制到 ArrayList 或直接使用我的 EmailService 发送电子邮件。

问题是,Spring给了我一个错误:

处理程序执行导致的已解决异常:org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported

这是我的 HTML

<form method="post" id="send-invite-mail" th:action="@{/sendmail/sendInvitations}">
  <div id="formfields">
    <div class="form-group">
      <input type="email" class="form-control" id="email1" name="email1" placeholder="Enter Email-Address ..."/>
    </div>
  </div>
  <!-- more form-groups are added here by JS -->
  <button type="submit" id="submitInvitation" class="btn btn-primary">Invite</button>
</form>

这就是我在后端用来获取我的值的方法

@PostMapping("/sendmail/sendInvitations")
public void getInvitationList (@RequestBody Map<String, String> formData){
   List<String> adressList = new ArrayList<String>();
   for (Map.Entry<String, String> entry : formData.entrySet()) {
      adressList.add(entry.getValue());
   }
}

现在我不知道我这样做是否正确。感谢任何帮助。

标签: javaspringformsrestpost

解决方案


以form-url-encodedmethod='post'形式发送数据的HTML 表单。所以,在这种情况下,Spring 无法将其理解为 RequestBody。因为, POST 数据期望内容类型为. 因此,如果您想真正以 json 格式发送数据,则必须删除 @RequestBody 注释。@RequestBodyapplication/json

最后,您可以consumes使用以下方式之一指定内容类型并使用:

1. @RequestParam而不是@RequestBody

@RequestMapping(value = "/sendmail/sendInvitations",
        method = RequestMethod.POST,
        consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, 
        produces = MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody returnType methodName(@RequestParam Map<String, String> name) {
    ...
}

2.删除@RequestBody并使用你的 POJO 类:

@RequestMapping(value = "/sendmail/sendInvitations",
        method = RequestMethod.POST,
        consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, 
        produces = MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody returnType methodName(YourPOJO pojo) {
    ...
}

我希望这可以帮助你。


推荐阅读