【问题标题】:error 400 when using @modelAttribute on ajax form submission在 ajax 表单提交上使用 @modelAttribute 时出现错误 400
【发布时间】:2014-01-27 15:53:21
【问题描述】:

我正在尝试使用@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; 根据 cmets,我尝试了以下方法;

$("#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"

【问题讨论】:

  • 模型属性是从请求参数反序列化的,但您似乎在发布 JSON。
  • 请求参数还是 JSON?选一个。对于请求参数,请保留 .serialize() 并删除 dataType: 'json'。对于 JSON,请使用 JS 库,例如 JSON3 + Spring MVC @RequestBody + Jackson 库
  • 所以我尝试使用 ajax 调用修改剥离 JSON 数据类型和 json 应用程序类型仍然抛出 400。
  • @SotiriosDelimanolis str 正在返回 "contentItemId=aa"
  • 您的处理程序方法也期待someId。你好像没有发送那个。将@RequestParam 属性视为required=false

标签: jquery ajax spring jsp spring-mvc


【解决方案1】:

我看到了一些问题。

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

一些细节。请在客户端验证网址。我质疑是否需要查询字符串 `?someId=${someId} ?发布请求不需要查询字符串。

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

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

注意!您当前的返回类型为 String (很好),但您返回的是 null。如果您需要对值进行硬编码,请返回有效路径。

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

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

【讨论】:

  • 方法未达到。 OP 从 Spring 的DispatcherServlet 收到了 400 分。也许 OP does 需要查询字符串。为什么方法签名应该这样?这是一个 AJAX 请求,也许 OP 不想返回响应正文。 null 在这种情况下是合适的。
  • 我放空是因为我还没有完成实现,因为我什至没有进入该方法,所以此时有一个有效的返回是没有意义的。我还验证了 ID 正在传递。
  • 您好,感谢您的回复。您可以发布网络浏览器在发布请求中发送的内容吗?能不能抓到数据。接下来在服务器上为什么不添加一个响应“get”请求(无参数)的简单方法。这应该有助于验证您是否有控制器配置或 web.xml 问题。使用 Web 浏览器或 Curl 测试获取请求。确保服务器路径正确。祝你好运。
  • 另一个问题。 “.spr”。那是哑剧类型吗?你需要它吗。它是否在您的 servlet 配置中定义?
【解决方案2】:

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

【讨论】:

  • 所以您的客户向错误的 url 发出请求?可以发一下状态吗?现在是关闭了吗?问题已回答:) 代码有效吗?
  • 400 错误对于 Spring MVC 来说很棘手。它们似乎只在调试级别记录。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-27
  • 1970-01-01
  • 1970-01-01
  • 2017-06-28
  • 2014-08-26
  • 1970-01-01
相关资源
最近更新 更多