Ошибка неподдерживаемого типа носителя в 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, то теперь я отправляю строковый литерал с переменной, которая содержит все данные.

И это работает как шарм!

Другие вопросы по тегам