在@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。即使我给 map 添加了一个值,它也不能绑定参数:

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

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

谢谢

296984 次浏览

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

myparam=myValue1&myparam=myValue2&myparam=myValue3

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

实现这一点的一种方法(以骇客的方式)是为 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'

或者你可以这样做:

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

例如这样的表单:

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

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

使用复选框切换更改隐藏字段值,如下所示..。

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


}


}

作为对 Donal Fellows 所说的补充,您可以使用@RequestParam 来使用 List

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

希望能有帮助!

订阅罗勒在评论中说的问题本身,如果 method = RequestMethod.GET你可以使用 @RequestParam List<String> groupVal

然后,使用 params 列表调用服务非常简单:

API_URL?groupVal=kkk,ccc,mmm

对我来说,虽然可以接受 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);
}

完整的例子可以在这里找到 ,希望可以省人头疼:)