当前位置: 首页 > 知识库问答 >
问题:

Spring@MVC和@RequestBody注释与x-www-form-urlencoded数据?

吴欣悦
2023-03-14

我试图弄清楚为什么当Spring@Controller处理程序方法包含@RequestBody注释时,我不能从jquery.ajax调用接收请求。考虑以下几点:

HTML/JavaScript:

<form id="foo" action="/baz">
  <input name="bar">
</form>

<script>
  $(function() {
    var $fooForm = $('#foo');

    $fooForm.on('submit', function(evt) {
      evt.preventDefault();

      $.ajax({
        url: $fooForm.action,
        data: $fooForm.serialize(),
        dataType: 'json',
        type: 'POST',
        success: function(data) { console.log(data); }
      });
    });
  });
</script>

Java:

@RequestMapping(
  value = "/baz",
  method = RequestMethod.POST,
  consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE,
  produces = MediatType.APPLICATION_JSON_VALUE
)
public @ResponseBody SearchResults[] jqueryPostHandler(
  @RequestBody FormDataObject formData)
{
  return this.searchService.find(formData);
}

如果出现@requestbody注释,上述操作将失败,并返回一个415错误(不会生成异常)。但是,如果删除@requestbody注释(即参数签名只是FormDataObject FormData),那么将调用该方法并将JSON返回给JavaScript。

为什么会这样呢?post请求包括请求正文中的数据。注释不应该处理这样的请求吗?

我意识到可以将JavaScript发送的内容类型更改为application/json,并将consumes属性更改为mediatype.application_json_value以使注释正确工作。但是为什么它不能用于正常的形式请求呢?

注意:我使用的是Spring3.1.4。

共有1个答案

冯俊英
2023-03-14

您是否尝试在'org.springframework.web'上登录以查找返回状态代码的原因?在转换为415之前,应该引发并记录一个异常。

另外,如果发送表单数据,为什么不省略@RequestBody。然后使用数据绑定(即@ModelAttribute),将Servlet请求参数应用于对象字段。这比使用FormHttpMessageConverter更好。

 类似资料:
  • 当内容类型为application/json时,@RequestBody可以读取请求主体并将其反序列化为对象,但内容类型为application/x-www-form-urlencoded,spring mvc无法支持带有@RequestBody注释的此内容类型。 在我的项目中,我遇到了这个问题,我想同时支持他们两个,但我不想失去@quiestBody的便利性。 有没有另一种方法来支持这两种内容类

  • 当内容类型不是text/html、text/plain或text/xml,而是application/x-www-form-urlencoded内容类型时,我很难理解如何设置字符集。 给出以下(简化的)javascript代码: 如果我没有显式设置编码, Firebug告诉我内容类型是"Application/x-www-form-urlencoded; charset=UTF-8"。 例如,如果

  • 问题内容: 之间有什么区别 request.ContentType =“ application / json; charset = utf-8”; 和 webRequest.ContentType =“ application / x-www-form-urlencoded”; 问题答案: 第一种情况是告诉Web服务器您正在发布JSON数据,如下所示: 第二个选项是告诉Web服务器您将对URL中

  • 我试图使用以下客户端代码调用REST服务,目的是发送一些字符串消息详细信息以及附件文件: 我的目标服务器接受Base64编码的内容,这就是为什么额外的从文件传输到ByteArray的原因。 此外,我发现类com.sun.jersey.core.impl.provider.entity.FormProvider用于生产和消费“x-www-form-urlencoded”请求。 但我还是得出了以下结论

  • 问题内容: 我写了下面的@Controller方法 请求失败并出现以下错误 [PS:泽西岛要友好得多,但鉴于此处的实际限制,现在无法使用它] 问题答案: 问题在于,当我们使用application / x-www-form-urlencoded时,Spring不会将其理解为RequestBody。因此,如果要使用它,则必须删除@RequestBody批注。 然后尝试以下操作:

  • 问题内容: 基于Spring @Controller对x-www-form-urlencoded的问的答案 我写了下面的@Controller方法 失败的请求因以下错误 [PS:Jersey要友好得多,但鉴于这里的实际限制,现在无法使用它] 问题答案: 问题在于,当我们使用 application / x-www-form-urlencoded时 ,Spring不会将其理解为RequestBody