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

标签 spring jquery spring-mvc

我试图弄清楚为什么当 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。然后,您将使用数据绑定(bind)(即 @ModelAttribute)将 Servlet 请求参数应用于对象字段。这比使用 FormHttpMessageConverter 更好。

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

相关文章:

javascript - 使用 rowIndex 和 cellIndex 更改表格单元格中的文本

javascript - Bootstrap3切换开关与ajax更新到mysql

validation - @Valid 注释可以在 spring mvc 中递归地检查字段吗?

java - Spring MVC @EnableWebMvc Bean 配置

java - 来自外部库的通用 Spring 服务?

java - 如何检测spring mvc中的错误

javascript - 保持按钮处于事件状态,直到再次点击

java - Spring BeanPostProcessor中的postProcessBeforeInitialization是什么意思?

java - 读取 persistence.xml 文件中的环境变量

java - 通过@ResponseBody 返回时更改 DTO JSON 中的日期格式