Spring Boot Ajax GET-запрос с параметром массива, полученный как список: «Не найден основной или конструктор по умолчанию для интерфейса java.util.List» - PullRequest
0 голосов
/ 08 мая 2019

Я отправляю Spring Controller запрос Ajax GET с параметром Array,

        $.ajax({
            url: "getChoices",
            dataType: "json",
            type: "get",
            data: {
                'myarg': myarray // JS array of strings, ["a","b","c"]
                                 // Verified to be correct
            },

Метод контроллера, который должен получить этот аргумент - имя аргумента соответствует:

@ResponseBody
@GetMapping("/getChoices")
public List<KeyValueBean> getChoices(List<String> myarg) {
    //...
}

Прежде всего, как написано выше, я получаю сообщение об ошибке:

[java.lang.IllegalStateException: No primary or default constructor found for interface 
 java.util.List]

Caused by: java.lang.NoSuchMethodException: java.util.List.<init>()
    at java.lang.Class.getConstructor0(Class.java:3082)
    at java.lang.Class.getDeclaredConstructor(Class.java:2178)
    at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.createAttribute(ModelAttributeMethodProcessor.java:216)

Затем я попытался сделать несколько настроек:

1) Сделал подпись метода a String[], это не то, что я хочу - мне нужен список - но попробовал на всякий случай:

public List<KeyValueBean> getChoices(String[] myarg) {

Это вошло в метод, но myarg равно NULL и не было правильно установлено.

2) Сохранял List<String>, но пробовал JSON.stringify для массива:

JSON.stringify(myarray)

То же исключение: [java.lang.IllegalStateException: No primary or default constructor found for interface java.util.List]

Как передать аргумент Array в запросе Ajax GET в Spring Boot?

Ответы [ 2 ]

0 голосов
/ 09 мая 2019

Единственное, что сработало для меня, это указать [] в @RequestParam значение:

@ResponseBody
@GetMapping("/getChoices")
public List<KeyValueBean> getChoices(@RequestParam(value="myarg[]")String[] myarg) {
    //...
}

Здесь это объяснено, https://stackoverflow.com/a/5702905/1005607

это связано с несовместимостью именования параметров между Spring и jQuery, где jQuery хочет поставить квадратные скобки, чтобы указать, что параметр - это массив (я думаю, PHP это тоже нравится), но где Spring не волнует.

0 голосов
/ 09 мая 2019

Вы забыли аннотировать свой параметр с помощью @RequestParam.

@GetMapping("/testList")
public void test(@RequestParam("myarg") List<String> myarg) {
    for (String str : myarg) {
        System.out.println(str);
    }
}

. Вы можете отправить запрос к конечной точке следующим образом, и он будет работать.

http://localhost:8080/testList?myarg=abc,def

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...