我想用JQuery向POST控制器发送一个POST请求但是我一直从jquery中得到这个错误
Could not read document: Unrecognized token 'contactForm': was expecting ('true', 'false' or 'null')
at [Source: java.io.PushbackInputStream@38220bcd; line: 1, column: 13]; nested exception is com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'contactForm': was expecting ('true', 'false' or 'null')
at [Source: java.io.PushbackInputStream@38220bcd; line: 1, column: 13]
这是POST请求
$('#contactForm').on('submit', function(e){
e.preventDefault();
var contactForm = new Object;
var firstName = $('#firstName').val();
var lastName = $('#lastName').val();
var email = $('#email').val();
var message = $('#message').val();
contactForm.firstName = firstName;
contactForm.lastName = lastName;
contactForm.email = email;
contactForm.message = message;
contactForm.accepted = true;
console.log(JSON.stringify(contactForm));
$.ajax({
type: 'POST',
url: '/checkContact.json',
contentType : 'application/json; charset=utf-8',
dataType: 'json',
data: {
contactForm: JSON.stringify(contactForm)
},
success: function(response){
console.log(response)
$('#success').text(response.message);
},
error: function(data){
console.log(data.responseJSON.message);
}
})
})
这是控制器
@PostMapping("/checkContact.json")
public @ResponseBody String sendContactForm(@Valid @RequestBody ContactForm contactForm, BindingResult result, HttpServletRequest request) throws MalformedURLException, JsonProcessingException{
//logic here
}
和ContactForm
public class ContactForm {
@NotNull
@NotEmpty
@ValidEmail
private String email;
@NotNull
@NotEmpty
private String firstName;
@NotNull
@NotEmpty
private String lastName;
@NotNull
@NotEmpty
private String message;
// @AssertTrue
private boolean accepted;
//getters and setters
}
我不确切知道发生了什么,因为例如,如果我尝试向控制器发送一个带有POSTMAN的JSON,这个主体与JSON.stringify(contactForm)
相同,一切顺利,所以杰克逊在幕后做了一些奇怪的事......
{
"fistName": "John",
"lastName": "Smith",
"email": "a@a.aa",
"message": "Hello"
"accepted":true
}
答案 0 :(得分:4)
在你的jQuery ajax调用中调整你的数据值:
$.ajax({
type: 'POST',
url: '/checkContact.json',
contentType : 'application/json; charset=utf-8',
dataType: 'json',
data: JSON.stringify(contactForm),
success: function(response){
console.log(response)
$('#success').text(response.message);
},
error: function(data){
console.log(data.responseJSON.message);
}
})
正在发生的事情是jQuery正在将您的对象转换为查询参数字符串并发送它。这看起来像:
contactForm=%7B%22fistName%22%3A%22John%22%2C%...
杰克逊试图将查询参数解释为您的请求主体失败。
这可以通过查看浏览器中的网络选项卡并查看请求正文来确认
答案 1 :(得分:0)
如果您在控制器中手动设置ObjectMapper类,如下所示。
ObjectMapper obj = new ObjectMapper();
obj.setSerializationInclusion(JsonInclude.Include.NON_NULL);
obj.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
或者
希望这有帮助。
既然你已经添加了SPRING标签,我会考虑从后端设置它。