Ошибка неподдерживаемого типа носителя в AJAX-Spring
Я пытаюсь передать POST-данные из моего jsp с помощью jquery-ajax в функцию контроллера Spring-MVC. Данные передаются нормально, и я могу напечатать данные JSON, когда я использую объект String для получения RequestBody. Но когда я использую DTO, у которого есть переменная List, объявленная с его собственными объектами, контроллер возвращает '415 Unsupported Media Type Error' со следующим утверждением:
Сервер отклонил этот запрос, потому что объект запроса находится в формате, который не поддерживается запрошенным ресурсом для запрошенного метода.
ниже приведен класс DTO
public class anyClassDTO{
private String name;
private List<anyClassDTO> subList = new ArrayList<anyClassDTO>();
//getters and setters here
}
Теперь вот функция контроллера
@RequestMapping(headers ={"Accept=application/json"}, value = "urlFromJsp", method = RequestMethod.POST)
public @ResponseBody
String addData (HttpServletRequest request,
@RequestBody List<anyClassDTO> dtoObject,
Model model)
{
return "{\"value\":\"true\"}";
}
Разве невозможно получить список объектов со страницы jsp на контроллер через AJAX?
Вот набор примеров данных, передаваемых из JSP
[{"Имя":"module1","Подсписок":[{"Имя":"chapter1","Подсписок":[{"Имя":"subchapter1","Подсписок": NULL}]}]},{"название":"module2","подсписок":[{"имя":"chapter1","подсписок":[{"имя":"subchapter1","подсписок": NULL}]}]}]
2 ответа
Убедитесь, что ваш запрос AJAX устанавливает запрос Content-Type
в application/json
,
Spring обычно использует MappingJacksonHttpMessageConverter
преобразовать тело запроса при указании @RequestBody
, это HttpMessageConverter
только поддерживает application/*+json
введите типы контента, поэтому вы должны убедиться, что ваш запрос содержит его.
Ну, мы могли бы заставить его работать как есть, добавив немного больше деталей. Вместо получения @ResponseBody в качестве объекта List, я создал еще один DTO, который содержит объект List исходного DTO. Таким образом, второй DTO - это в основном пустышка, которая получает данные из AJAX как единый объект.
Как я уже сказал в вопросе, у меня есть DTO следующим образом
public class AnyClassDTO{
private String name;
private List<anyClassDTO> subList = new ArrayList<anyClassDTO>();
//getters and setters here
}
Я создал другой DTO, который содержит список вышеупомянутого DTO
public class DummyDTO{
private List<AnyClassDTO> dummyObj;
//getters and setters here
}
Затем в контроллере я изменил функцию на
@RequestMapping(headers ={"Accept=application/json"}, value = "urlFromJsp", method = RequestMethod.POST)
public @ResponseBody
String addData (HttpServletRequest request,
@RequestBody DummyDTO dummyDTOObj,
Model model)
{
return "{\"value\":\"true\"}";
}
Если раньше я отправлял список напрямую из AJAX, то теперь я отправляю строковый литерал с переменной, которая содержит все данные.
И это работает как шарм!