Spring @MVC和带有x-www-form-urlencoded数据的@RequestBody注释?

Jam*_*ers 9 jquery spring spring-mvc

我试图弄清楚为什么我不能从jQuery.ajax调用接收请求,然后Spring @Controller处理程序方法包含一个@RequestBody注释.考虑以下:

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>
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

以上将失败并且@RequestBody注释存在并返回415错误(不会生成异常).但是如果@RequestBody删除了注释(即参数签名只是FormDataObject formData),那么将调用该方法并将JSON返回给JavaScript.

为什么会这样?甲POST请求包括在请求的主体中的数据.不应该注释过程这样的请求吗?

我意识到我可以将JavaScript发送的内容类型application/jsonconsumes属性更改MediaType.APPLICATION_JSON_VALUE为使注释正常工作.但为什么它不适用于正常的表单请求?

注意:我使用的是Spring 3.1.4.

Ros*_*hev 7

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

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

  • 以我有限的理解,注解`@RequestBody` 暗示要处理的数据将在请求的正文中。这会通知编译器_和_阅读代码的人。因此,留下它会导致代码不明确。这就是为什么我想知道为什么会失败。 (2认同)

Qia*_*yue 6

正如@RequestBodySpring Docs所说,请求体将被转换为您的对象HttpMessageConverter.

有4个默认的HttpMessageConverters:

要转换url编码的表单,即ajax.serialize()创建,它的作用是FormHttpMessageConverter.既然你有HttpMediaTypeNotSupportedException例外,我想你没有配置FormHttpMessageConverter.检查你的spring配置文件,这是一个例子:

< bean class ="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" >
   < property name= "messageConverters" >
         < list>
             < ref bean= "mappingJacksonHttpMessageConverter" />
             < ref bean= "stringHttpMessageConverter" /> 
             <!-- Do you have this converter ? -->
             < ref bean= "formHttpMessageConverter" />
         </ list>
    </ property>
</ bean>
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

32235 次

最近记录:

9 年,2 月 前