我在Spring MVC上有一个简单的java应用程序,我向Spring控制器发送ajax请求。当我设置标题"接受"," application / json" 和" Content-Type","应用程序时/ json; charset = utf-8" 在AJAX调用中我在dubugger中得到 错误400 ,当我删除它时我得到 错误415 。
如果我将控制器方法签名更改为 public String logoutPage(@RequestBody String obyavleniye) ,我会获得JSON字符串。控制器中的解析请求有什么问题?
JS方法:
$("#advertForm").submit(function(e) {
e.preventDefault();
var token = $("meta[name='_csrf']").attr("content");
var header = $("meta[name='_csrf_header']").attr("content");
var obyavleniye = {
title: "Title",
price: "80",
description: "desc",
date: "2016-11-07 18:30:21",
authorid: "2",
category: "A",
state: "new",
img1: "http",
img2: "http",
img3: "http",
img4: "http",
};
var post_data = JSON.stringify(obyavleniye);
console.log(post_data);
$.ajax({
url : "/upload",
type: "POST",
dataType: 'json',
data: post_data,
beforeSend: function(xhr) {
xhr.setRequestHeader("Accept", "application/json");
xhr.setRequestHeader("Content-Type", "application/json;charset=utf-8");
xhr.setRequestHeader(header, token);
},
complete: function() {
console.log("Sent");
},
success: function (response) {
console.log("success");
console.log("response" + response);
},
error: function (data) {
console.log("error");
console.log(data);
}
});
});
控制器方法:
@ResponseBody
@RequestMapping(value="/upload", method = RequestMethod.POST)
public String logoutPage (@RequestBody Advert obyavleniye) {
// public String logoutPage (@RequestBody String obyavleniye) {
System.out.println("Enter: " + obyavleniye);
this.advertService.addAdvert(obyavleniye);
// return "{\"msg\":\"success\"}";
return "{\"title\":\"Title\",\"price\":\"80\",\"description\":\"normm\",\"date\":\"2016-11-07 18:30:21\",\"authorid\":\"2\",\"category\":\"A\",\"state\":\"new\",\"img1\":\"http\",\"img2\":\"http\",\"img3\":\"http\",\"img4\":\"http\"}";
}
答案 0 :(得分:1)
我的示例代码。
<强> JS 强>
Company.prototype.saveCompanyLocation = function() {
/* company */
var companyIdx = $('#companyIdx').val();
var locationIdx = $('#locationIdx').val();
var data = {
idx : locationIdx,
postCode : $('#postCode').val(),
address : $('#address').val(),
detailAddress : $('#detailAddress').val(),
tel : $('#tel').val(),
fax : $('#fax').val(),
email : $('#email').val(),
language : $("#language").val(),
latitude : $('#latitude').val(),
longtitude : $('#longtitude').val()
};
data = JSON.stringify(data);
$.ajax({
url : "/gpim/company/settings/location/save/" + companyIdx,
type : 'POST',
data : data,
contentType : 'application/json',
success : function(response) {
if (response == "success") {
document.location.reload(true);
} else {
$("#editMsg").text("you can`t save location information.");
}
},
error : function(request, status, error) {
}
});
};
<强>控制器强>
@RequestMapping(value = "/settings/location/save/{companyIdx}", method = RequestMethod.POST)
public @ResponseBody String saveLocation(@PathVariable int companyIdx, @RequestBody CompanyLocation location) {
Company company = companyService.findCompanyByIdx(companyIdx);
company = companyService.saveCompanyLocation(company, location);
if (company != null) {
return "success";
}
return "fail";
}
答案 1 :(得分:1)
执行以下步骤:
1)尝试将jackson jar文件保存在类路径中
2)eighter你发送ajax请求时删除了数据类型,即
dataType : "json"
或者您必须按如下所示生成application / json响应
@RequestMapping(value = "/upload", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
3)检查您的DTO或广告类属性哪个类型应与传入请求匹配。即请求参数应与DTO成员的名称和类型相匹配。
这些是避免你的情况的可行方法。