#java #javascript #ajax #json #spring-mvc
#java #javascript #ajax #json #весна-mvc #spring-mvc
Вопрос:
Соответствующий JS:
$.ajax({
type : "POST",
contentType : 'application/json; charset=utf-8',
dataType : 'json',
url : "post",
data : JSON.stringify(person),
success : function() {
},
error : function() {
alert("Error");
}
});
Соответствующий код контроллера:
@ResponseStatus(HttpStatus.OK)
@RequestMapping(value = "/post", method = RequestMethod.POST)
public void posted(@RequestBody Person person) {
System.out.println("Post");
System.out.println(person.toString());
}
Проблема:
После публикации контроллер ведет себя так, как будто все работало просто отлично. Мои операторы печати запускаются, и person.toString() выдает ожидаемые результаты. Однако мой вызов ajax завершается с ошибкой, и я не могу понять, почему, потому что, кроме этого, все работает просто отлично.
Я попытался использовать Postman для отправки JSON вручную, и я получаю ответ «415 неподдерживаемый тип носителя», и после некоторого копания я все еще не знаю, как справиться с этой ошибкой, поэтому срабатывает моя функция success (). Есть идеи?
Комментарии:
1. Весь ваш метод не должен вызываться. Можете ли вы показать свою конфигурацию Spring MVC? На какой весенней версии вы работаете?
2. Или, скорее, вы должны получать 406, а не 415.
3. Удаление атрибута типа данных в моем вызове ajax исправило это. Почему вы говорите, что весь мой метод не должен вызываться? Я нахожусь на Spring 4.0.5
4. Тип данных ожидает ответа json от сервера, на который, поскольку вы не отвечаете никаким ответом.
5. 415 означает, что сервер ожидает контент, отличный от того, который вы отправляете. Произойдет сбой даже до создания
Person
объекта, который ему необходимо передать методу.
Ответ №1:
Атрибут типа данных функции .ajax() в jQuery — это «Тип данных, которые вы ожидаете получить обратно с сервера».
Вам следует удалить его, если вы не выводите json в своем контроллере.
Для получения дополнительной информации смотрите документ
Ответ №2:
удалите это:
contentType : 'application/json; charset=utf-8',
потому что ваш тип контента — обычный текст с самого начала:
System.out.println("Post");
Этот ContentType будет работать, только если содержимое является json.
Комментарии:
1. Я думаю, то же самое с атрибутом типа данных.
2. Атрибут ContentType необходим Джексону для преобразования строки JSON в объект. Его удаление нарушает мои инструкции печати
3. Однако удаление атрибута типа данных исправило это, спасибо @caRameL.
4. К вашему сведению, согласно документу jQuery: «любой неверно сформированный JSON отклоняется и выдается ошибка синтаксического анализа. Начиная с jQuery 1.9, пустой ответ также отклоняется; вместо этого сервер должен вернуть ответ null или {}. »
5. Содержимое в формате json
JSON.stringify(person),
.