在ajax表单提交上使用@modelAttribute时出现错误400

时间:2014-01-27 15:53:21

标签: jquery ajax spring jsp spring-mvc

我正在尝试使用@ModelAttribute,但我似乎无法超越此400(错误请求)。我看了很多SO帖子,但似乎都没有解决我所看到的问题。

以下是我尝试过的一些事情:

  • 重新排序函数
  • 上的参数
  • 模型属性
  • 上没有(“someForm”)参数
  • 将其作为html表单而不是spring表单提交

我试图将它简化到最低限度,然后才把它放到SO上,但仍然无法让它消失。有什么想法吗?

这是控制器

@RequestMapping(value = "/r/save.spr", method = RequestMethod.POST)
public String saveItem(@RequestParam(value = "someId") UUID someId,
                       @ModelAttribute("thisForm") StyleData styleData,
                       BindingResult bindingResult) {
    System.out.println();

    return null;
}

这是模型。

public class StyleData {

    public String itemId;

    public String getItemId() {
        return itemId;
    }

    public void setItemId(String itemId) {
        this.itemId = itemId;
    }

这是我的JSP

<form:form id="thisForm" modelAttribute="thisForm">
    <input name="itemId"/>
</form:form>

这是我用来提交表单的JS。

$("#thisForm").submit(function () {
    var str = $("#thisForm").serialize();

    $.ajax({
        type: "post",
        data: str,
        url: "/r/save.spr?someId=${someId}",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function() {
            console.log("here")
        },
        error: function(e){
            debugger;
            console.log("fail")
        }
    });

    console.log("Here");
    return false;
});

更新1; 根据评论我尝试了以下内容;

$("#thisForm").submit(function () {
    var str = $("#thisForm").serialize();

    $.ajax({
        type: "post",
        data: str,
        url: "/r/save.spr?someId=${someId}",
        success: function() {
            console.log("here")
        },
        error: function(e){
            debugger;
            console.log("fail")
        }
    });

    console.log("Here");
    return false;
});

更新2:

我被问到str正在返回什么。

"itemId=aa"

2 个答案:

答案 0 :(得分:0)

我看到了很多问题。

首先,我建议您分析两个层(客户端和服务器)上的请求/响应。例如,如果您的客户端是像Chromium或FireFox这样的Web浏览器,那些浏览器上的开发人员工具会公开发送到服务器的请求和响应详细信息。在服务器端,我将使用java调试器并首先验证您的方法是否已到达。您希望确保您的映射/配置正确。

一些细节。在客户端请验证网址。我怀疑是否需要查询字符串`?someId = $ {someId}?您不应该为帖子请求提供查询字符串。

在服务器上,您的方法签名应为:

public String saveItem(@ModelAttribute StyleData styleData, 
      BindingResult bindingResult, Model model)

请注意!你当前有返回类型的String(没关系),但你返回null。如果需要对值进行硬编码,请返回有效路径。

最后一个提示。您也可以使用Curl模拟您的客户请求。如果您尝试这样做,您会发现内容类型中不需要; charset=utf-8

希望有所帮助。 请发布您的分析结果:)

答案 1 :(得分:0)

发现这是因为我错过了URL上的应用程序上下文。讨厌它只是扔了400而不是更有用的东西。