我试图弄清楚为什么当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,以使注释正常工作。但是,为什么它不能与普通表单请求一起使用?

注意:我正在使用Spring 3.1.4。

最佳答案

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

另外,如果发送表单数据,为什么不直接删除@RequestBody。然后,您将使用将Servlet请求参数应用于对象字段的数据绑定(bind)(即@ModelAttribute)。这比使用FormHttpMessageConverter更可取。

关于Spring @MVC和带有x-www-form-urlencoded数据的@RequestBody批注?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16449141/

10-10 03:19