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

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

109 голосов
/ 04 января 2011

Я отправляю некоторые параметры из формы следующим образом:

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 сатрибут списка?

Спасибо

Ответы [ 7 ]

104 голосов
/ 11 апреля 2011

Или вы можете просто сделать это следующим образом:

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

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

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

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

66 голосов
/ 04 января 2011

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

myparam=myValue1&myparam=myValue2&myparam=myValue3

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

16 голосов
/ 17 февраля 2016

Просто дополняя сказанное Donal Fellows, вы можете использовать List с @ RequestParam

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

Надеюсь, это поможет!

10 голосов
/ 06 января 2011

Один из способов, которым вы могли бы сделать это (хакерским способом), - создать класс-оболочку для 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'
7 голосов
/ 13 февраля 2017

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

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

API_URL?groupVal=kkk,ccc,mmm
2 голосов
/ 16 января 2019

Для меня не было очевидным, что, хотя вы можете принять коллекцию в качестве параметра запроса, но на стороне потребителя вы все равно должны передавать элементы коллекции в виде значений, разделенных запятыми .

Например, если api на стороне сервера выглядит так:

@PostMapping("/post-topics")
public void handleSubscriptions(@RequestParam("topics") Collection<String> topicStrings) {

    topicStrings.forEach(topic -> System.out.println(topic));
}

Непосредственная передача коллекции в RestTemplate в виде RequestParam, например ниже, приведет к повреждению данных

public void subscribeToTopics() {

    List<String> topics = Arrays.asList("first-topic", "second-topic", "third-topic");

    RestTemplate restTemplate = new RestTemplate();
    restTemplate.postForEntity(
            "http://localhost:8088/post-topics?topics={topics}",
            null,
            ResponseEntity.class,
            topics);
}

Вместо этого вы можете использовать

public void subscribeToTopics() {

    List<String> topicStrings = Arrays.asList("first-topic", "second-topic", "third-topic");
    String topics = String.join(",",topicStrings);

    RestTemplate restTemplate = new RestTemplate();
    restTemplate.postForEntity(
            "http://localhost:8088/post-topics?topics={topics}",
            null,
            ResponseEntity.class,
            topics);
}

Полный пример можно найти здесь , надеюсь, это спасет кого-то от головной боли:)

0 голосов
/ 05 февраля 2015

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

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');

    }

}
...