Привязка списка в @RequestParam



Я посылаю некоторые параметры из формы таким образом:



myparam[0]     : 'myValue1'
myparam[1] : 'myValue2'
myparam[2] : 'myValue3'
otherParam : 'otherValue'
anotherParam : 'anotherValue'
...


Я знаю, что могу получить все параметры в методе контроллера, добавив параметр, например



public String controllerMethod(@RequestParam Map<String, String> params){
....
}


Я хочу привязать параметры myParam [] (а не другие) к списку или массиву (все, что сохраняет порядок индексов), поэтому я попытался использовать синтаксис типа:



public String controllerMethod(@RequestParam(value="myParam") List<String> myParams){
....
}


и



public String controllerMethod(@RequestParam(value="myParam") String[] myParams){
....
}


но ни один из них не связывает myParams. Даже когда я добавляю значение на карту это не удается связать параметры:



public String controllerMethod(@RequestParam(value="myParam") Map<String, String> params){
....
}


есть ли синтаксис для привязки некоторых параметров к списку или массиву без необходимости создавать объект как @ ModelAttribute с атрибутом списка в нем?



спасибо

627   6  

6 ответов:

массивы @RequestParam используются для привязки нескольких одноименных параметров:

myparam=myValue1&myparam=myValue2&myparam=myValue3

Если вам нужно, чтобы связать @ModelAttribute-стиль индексированных параметров, я думаю, вам нужен @ModelAttribute в любом случае.

или вы могли бы просто сделать это таким образом:

public String controllerMethod(@RequestParam(value="myParam[]") String[] myParams){
    ....
}

это работает, например, для таких форм:

<input type="checkbox" name="myParam[]" value="myVal1" />
<input type="checkbox" name="myParam[]" value="myVal2" />

Это самое простое решение :)

просто дополняя то, что сказал Донал Феллоуз, вы можете использовать List с @RequestParam

public String controllerMethod(@RequestParam(value="myParam") List<ObjectToParse> myParam){
....
}

надеюсь, что это помогает!

один из способов, которым вы могли бы сделать это (по-хакерски), - создать класс-оболочку для List. Вот так:

class ListWrapper {
     List<String> myList; 
     // getters and setters
}

тогда ваша подпись метода контроллера будет выглядеть так:

public String controllerMethod(ListWrapper wrapper) {
    ....
}

нет необходимости использовать @RequestParam или @ModelAttribute аннотация если имя коллекции, которое вы передаете в запросе, совпадает с именем Поля коллекции класса-оболочки, в моем примере ваши параметры запроса должны выглядеть так:

myList[0]     : 'myValue1'
myList[1]     : 'myValue2'
myList[2]     : 'myValue3'
otherParam    : 'otherValue'
anotherParam  : 'anotherValue'

подписавшись на то, что Василий сказал в комментарии к самому вопросу, если method = RequestMethod.GET можно использовать @RequestParam List<String> groupVal.

тогда вызов службы со списком параметров так же просто, как:

API_URL?groupVal=kkk,ccc,mmm

изменить значение скрытого поля с переключателем флажка, как показано ниже...

HTML:

<input type='hidden' value='Unchecked' id="deleteAll" name='anyName'>
<input type="checkbox"  onclick="toggle(this)"/> Delete All

сценарий:

function toggle(obj) {`var $input = $(obj);
    if ($input.prop('checked')) {

    $('#deleteAll').attr( 'value','Checked');

    } else {

    $('#deleteAll').attr( 'value','Unchecked');

    }

}

Comments

    Ничего не найдено.