我正在尝试通过使用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 />
现在一切正常!
答案 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响应代码。这通常可以告诉你很多。