绑定@RequestParam中的列表

时间:2011-01-04 17:09:25

标签: java spring data-binding collections spring-mvc

我以这种方式从表单发送一些参数:

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){
    ....
}

是否有任何语法将一些参数绑定到列表或数组而不必创建一个具有list属性的@ModelAttribute对象?

由于

7 个答案:

答案 0 :(得分:104)

或者你可以这样做:

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

例如对于这样的表格有用:

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

这是最简单的解决方案:)

答案 1 :(得分:66)

@RequestParam中的数组用于绑定多个同名参数:

myparam=myValue1&myparam=myValue2&myparam=myValue3

如果你需要绑定@ModelAttribute - 样式的索引参数,我想你无论如何都需要@ModelAttribute

答案 2 :(得分:16)

只是补充Donal Fellows所说的,你可以使用List with @RequestParam

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

希望它有所帮助!

答案 3 :(得分:10)

答案 4 :(得分:6)

如果method = RequestMethod.GET @RequestParam List<String> groupVal可以使用API_URL?groupVal=kkk,ccc,mmm ,则订阅罗勒在问题评论中所说的内容。

然后使用params列表调用服务就像这样简单:

#define flag true

void Foo()
{
   for (size_t i = 0; i < veryBigNumber; i++)
   {
      if (flag)
         doSomething1();
      doSomething2();
   }
}

答案 5 :(得分:1)

虽然您可以接受Collection作为请求参数,但对我而言并不明显,但是在消费者方面,您仍然必须以逗号分隔的值形式传递集合项。

例如,如果服务器端api如下所示:

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

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

像下面的一样直接将集合作为RequestParam传递给RestTemplate会导致数据损坏

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

The complete example can be found here,希望它可以使人免于头痛:)

答案 6 :(得分:-5)

使用下面的复选框切换更改隐藏的字段值...

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

    }

}