【问题标题】:Can't send Ajax POST json request to spring controller无法向 Spring 控制器发送 Ajax POST json 请求
【发布时间】:2014-04-23 10:13:14
【问题描述】:

我目前正在尝试通过使用 Ajax POST json 请求将数据从我的 jsp 网页视图发送到我的 spring 控制器,但是对于某些接收控制器的人来说似乎从未接收到它。奇怪的是,当我使用 GET 请求时它可以工作,但由于它是需要存储在数据库中的有价值的数据,所以我更喜欢使用 POST。

我的 JSP 视图中的 javascript 代码:

function ajaxEdit(){
            var aData = oTable.fnGetData( iPos );//get data of the clicked row
            var id = aData[0];
            var data = {
                    id : id,
                    name : $('#editName').val(),  
                    email : $('#editEmail').val(), 
                    phoneNumber : $('#editPhoneNumber').val(), 
                    address : $('#editAddress').val(),
                    city : $('#editCity').val(),
                    postalCode : $('#editPostalCode').val(), 
                    funct : $('#editFunction').val(),
                    company : $('#editCompany').val(),
            };
            $.ajax({  
             type : "POST",   
             contentType: "application/json; charset=utf-8",
             url : "ajaxEditPerson.htm",
             dataType: "json",
             data : JSON.stringify(data),
             success : function(response) {  
                 alert(response);
             },  
             error : function(e) {  
                 alert('Error: ' + e);   
                }  
               });  
        }

还有我的弹簧控制器:

    @RequestMapping(value = "ajaxEditPerson", method=RequestMethod.POST)
public @ResponseBody
String ajaxEditPerson(@RequestBody Person person, HttpServletRequest request){
    System.out.println("received edit request: " + person.toString());
    //Save edited item in database
    personManager.addPerson(person);
    return "okay";
}

我在这里做错了什么?由于第一行打印从未执行,因此该请求似乎根本没有到达此方法。此外,javascript 代码中的错误代码警报总是给我这个“错误:对象对象”错误。我还在 maven 中添加了以下 2 个依赖项:

           <!-- Jackson JSON Mapper -->
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.9.13</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-core-asl</artifactId>
        <version>1.9.13</version>
    </dependency>
       </dependencies>

编辑:

我已将控制器方法参数更改为:

@RequestMapping(value = "ajaxEditPerson", method=RequestMethod.POST)
public @ResponseBody
String ajaxEditPerson(@ModelAttribute("person") Person person, HttpServletRequest request, HttpServletResponse response){
    System.out.println("received edit request: " + person.toString());
    return "okay";
}

现在执行打印,所以至少请求已经到达了方法。但是它包含的数据都是 NULL 并且 ajax 请求仍然会收到错误响应而不是成功的响应....

EDIT2:

我现在可以成功执行 ajax GET 和 POST 请求,但没有 JSON。由于某种原因,json 似乎不起作用。控制器中的相应方法可以接收数据但说它为NULL。在使用 json 之前我还应该设置什么吗?配置文件中有什么?

EDIT3:

原来我需要在我的 spring 配置的下面一行:

<mvc:annotation-driven />

现在一切正常!

【问题讨论】:

  • 我怀疑网址不正确
  • 就像我说的,当使用具有相同 url 的 GET 时它工作正常...
  • 成功后会有什么反应?
  • 成功响应是“好的”,但错误响应是“错误:对象对象”。不知道那是什么意思..
  • 表示方法中发生服务器端错误

标签: jquery ajax spring spring-mvc


【解决方案1】:

将此作为答案,因为它不适合评论...

您的@RequestMapping 不包含“.htm”,但您在 $ajax() 调用中的 URL 包含。我怀疑你那里不匹配。此外,假设您将其作为部署到 Web 容器的 WAR 运行,我也没有将 WAR 上下文视为 JavaScript 端请求 URL 的一部分。我希望看到类似MyWar/someControllerLevelPath/ajaxEditPerson 的内容,其中“someControllerLevelPath”是可选的,但设置在控制器级别。

我的建议是使用一些浏览器调试器(Chrome 的开发工具、FireFox 的 FireBug、IE 的开发工具)来查看正在发送的内容以及您返回的确切响应/HTTP 错误代码。您可以使用这些工具查看 HTTP 请求标头的外观(包括完整的请求 URL 以及主机等)以及发送回的有效负载/标头。根据我在您的示例代码中看到的内容,我怀疑您会收到 404 NOT FOUND。如果是这种情况,那么您的 URL 映射是错误的。如果您还有其他问题,请回复此内容,我们可以解决。

另一个建议是在你的 Spring 控制器中添加一些 System.out.println() 语句,看看你的处理程序方法是否被调用,如果是,确定调用的距离。您的处理程序很可能被调用,但在某处失败。如果是这种情况,我相信您的 HTTP 响应代码将是 500。另一种选择是在 IDE 中运行您的服务器,或者在 JVM 中打开远程调试并使用调试器(如 Eclipse 或 NetBeans)附加到它,然后在你的处理程序方法中添加断点。

Id 的开始很简单,看看你首先得到了什么 HTTP 响应代码。这通常可以告诉你很多。

【讨论】:

  • 感谢您的回复!但不幸的是,它并没有对我有太大帮助。你是对的,RequestMapping 和 Ajax url 不匹配,但我在 spring 中设置了一个 internalresourceviewresolver 来解决这个问题。因此,我可以省略 WAR 上下文部分,spring 会自动将其映射到正确的控制器方法。我刚刚尝试了您建议的 chrome 开发工具,并观察了如果我提出这个请求会发生什么。状态显示“已取消”,但请求 url 确实是“MyWar/someControllerLevelPath/ajaxEditPerson.htm”。另外我在方法开始时已经有一条打印线
  • 也没有可用的响应数据。所以看起来请求被发送到服务器但没有收到响应。但在那种情况下,我们不会得到一个超时状态而不是取消吗?
  • 那么,你有一个 HTTP 206 吗?如果不是,您返回的确切 HTTP 错误/返回代码是什么?响应正文中是否有任何数据?我不知道你为什么要跳过这么多圈来使你的请求映射看起来非常混乱。如果您正在部署单个应用程序,为什么不直接使用嵌入式 Tomcat/Jetty,这样您就不必担心 WAR 上下文?似乎在未来支持这将是一场噩梦,因为您知道必须知道正在发生这种中间转换。
  • 实际上,我正在使用 eclipse/maven/tomcat 设置进行开发,而 spring 中的 internalresourceviewresolver 只是一个简单的 bean,它可以为我处理这一切。到目前为止,它非常简单并且运行良好......关于 HTTP 代码,奇怪的是,chrome 开发工具只是显示“已取消”而不是实际错误号,并且没有可显示的响应数据。这就是我在上一篇文章中的意思,也许我应该更清楚......
  • 看看这个。不确定它是否适用,因为上面的示例似乎没有执行它所说的会触发 Chrome 取消的 3 件事:stackoverflow.com/questions/12009423/…
猜你喜欢
  • 2021-08-09
  • 2018-01-25
  • 2014-05-07
  • 2016-05-17
  • 2021-04-08
  • 2015-10-09
  • 1970-01-01
  • 2016-03-16
  • 1970-01-01
相关资源
最近更新 更多