【问题标题】:Spring-MVC - JSON ajax post to controller errors outSpring-MVC - JSON ajax 发布到控制器错误
【发布时间】:2014-07-02 15:34:27
【问题描述】:

相关JS

$.ajax({
    type : "POST",
    contentType : 'application/json; charset=utf-8',
    dataType : 'json',
    url : "post",
    data : JSON.stringify(person),
    success : function() {

    },
    error : function() {
        alert("Error");
    }
});

相关控制器代码:

@ResponseStatus(HttpStatus.OK)
@RequestMapping(value = "/post", method = RequestMethod.POST)
public void posted(@RequestBody Person person) {
    System.out.println("Post");
    System.out.println(person.toString());
}

问题:

发布后,控制器的行为就像一切正常。我的打印语句触发并且 person.toString() 产生了预期的结果。但是,我的 ajax 调用失败,提示“错误”,我不知道为什么,因为除此之外,一切正常。

我尝试使用 Postman 手动发布 JSON,我收到“415 Unsupported Media Type”的响应,经过一番挖掘,我仍然不知道如何处理这个错误,所以我的 success()函数触发。有什么想法吗?

【问题讨论】:

  • 你的整个方法不应该被调用。你能展示你的 Spring MVC 配置吗?您使用的是哪个 Spring 版本?
  • 或者更确切地说,您应该得到 406,而不是 415。
  • 删除我的 ajax 调用中的 dataType 属性确实修复了它。你为什么说我的整个方法不应该被调用?我在 Spring 4.0.5
  • dataType 需要来自服务器的 json 响应,因为您没有响应任何响应。
  • 415 表示服务器期望的内容与您发送的内容不同。它甚至在创建它需要传递给方法的Person 对象之前就会失败。

标签: java javascript ajax json spring-mvc


【解决方案1】:

jQuery 中 .ajax() 函数的 dataType 属性是“您期望从服务器返回的数据类型。”

如果你的 Controller 中没有输出 json,你应该删除它。

有关详细信息,请参阅doc

【讨论】:

    【解决方案2】:

    删除这个:

    contentType : 'application/json; charset=utf-8',
    

    因为您的内容类型从一开始就是纯文本:

    System.out.println("Post");
    

    该 contentType 仅在内容为 json 时才有效。

    【讨论】:

    • 与我认为的 dataType 属性相同。
    • Jackson 需要 contentType 属性才能将 JSON 字符串解析为对象。删除它会破坏我的打印语句
    • 但是,删除 dataType 属性确实解决了问题,感谢@caRameL。
    • FYI 根据 jQuery 文档:“任何格式错误的 JSON 都会被拒绝并引发解析错误。从 jQuery 1.9 开始,空响应也会被拒绝;服务器应返回 null 或 { } 而不是。”
    • 内容为jsonJSON.stringify(person),
    猜你喜欢
    • 2012-12-30
    • 1970-01-01
    • 2012-10-03
    • 2017-12-09
    • 2013-01-11
    • 2011-05-06
    • 1970-01-01
    • 2012-09-08
    相关资源
    最近更新 更多