Передача массива JSON контроллеру Spring

#ajax #spring #post

#ajax #spring #Публикация

Вопрос:

У меня есть Spring Boot 2.1.3 веб-приложение thymeleaf. Я пытаюсь передать массив json контроллеру с помощью ajax POST. Массив JSON строится следующим образом:

 var obj = [];
$('#fornitori-table').find('tr').each(function () {
  var row = $(this);
  if (row.find('input[type="checkbox"]').is(':checked')) {
     var cellObj = row.find('td:eq(1)');
     if (cellObj.length > 0) obj.push({ idFurn : cellObj[0].innerText });
     }
});
  

Теперь, если я передам obj-массив через GET следующим образом:

 location.href = "/sendRdo/" encodeURI(JSON.stringify(obj));
  

контроллеру:

 @GetMapping("/sendRdo/{idS}")
public String sendRdo(@PathVariable JSONArray obj, Model model) {
....
}
  

все работает хорошо .. если я попытаюсь передать его с помощью ajax post:

 $.ajax({
    type: "POST",
    url: "/sendRdo",
    dataType: "json",
    data: JSON.stringify(obj), 
    contentType: "application/json",
    success: function(data) {

    }
  });
  

Я всегда получал ошибку com.fasterxml.jackson.databind.exc.MismatchedInputException, если я не помещал объект как полученный тип в контроллер:

 public String sendRdo(@RequestBody Object obj, Model model) {
}
  

Если я отлаживаю и указываю переменную obj, я вижу LinkedHashMap .. но если я помещу Map<> вместо Object, я получу ошибку выше.

Я использую:

 <dependency>
        <groupId>org.json</groupId>
        <artifactId>json</artifactId>
        <version>20180813</version>
</dependency>
  

для json

Можете ли вы мне помочь? Спасибо

Ответ №1:

Возможное решение (без создания pojo):

 function foo() {
  var obj=[];
  obj.push({id : 1});
  obj.push({id : 2});
  $.ajax({
       type: "post",
       url: "/test",
       contentType: "application/json",
       dataType:"json",
       data: JSON.stringify(obj),
       success: function(result) {

       }
  });
}
  

Контроллер:

 @PostMapping("/test")
String test(@RequestBody Object obj) {
    List<Map<String,Integer>> list = (ArrayList)obj;
    list.forEach(m -> m.forEach( (k,v) -> System.out.println("key: " k " value:" v)) );
    return "someview";
}
  

надеюсь, это поможет.