无法向Spring控制器发送Ajax POST json请求

时间:2014-04-23 10:13:14

标签: jquery ajax spring spring-mvc

我正在尝试通过使用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:

原来我需要按照以下方式进行弹簧配置:

<mvc:annotation-driven />

现在一切正常!

1 个答案:

答案 0 :(得分:0)

这是一个答案,因为它不适合评论......

您的@RequestMapping不包含'.htm',但您在$ ajax()调用中的网址确实如此。我怀疑你有不匹配的地方。此外,假设您将此作为部署到Web容器的WAR运行,我也不会将WAR上下文视为JavaScript端请求URL的一部分。我希望看到像MyWar/someControllerLevelPath/ajaxEditPerson这样的东西,其中“someControllerLevelPath”是可选的,但是在Controller级别设置。

我的建议是使用一些浏览器调试器(Chrome的Dev Tools,FireFox的FireBug,IE的开发工具)来查看正在发送的内容以及您要回复的EXACT响应/ HTTP错误代码。您可以使用这些工具查看HTTP请求标头的外观(包括完整的请求URL以及主机等)以及要发回的有效负载/标头。我怀疑你将根据我在示例代码中看到的内容获得404 NOT FOUND。如果是这种情况,那么您的URL映射是错误的。如果你得到别的东西,那么回复这个,我们可以搞清楚。

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

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