我正在使用Spring MVC框架进行REST服务。
我有一个方法:
@RequestMapping("/rest/{tableName}", method = RequestMethod.GET)
public @ResponseBody CustomObject query(
@PathVariable("tableName") String tableName,
@RequestParam(value="columns", required=false) String[] columns,
@RequestParam(value="filter", required=false) String[][] filters) {
...
}
好吧,我希望过滤器成为具有特定结构的二维数组:
如果我使用此网址
/rest/table?filter=filter1,filter2&filter=filter3
进行请求,那么我就有了filters = {{filter1, filter2}, {filter3}}
如果我这样做:
/rest/table?filter=filter1&filter=filter2
我有:filters = {{filter1},{filter2}}
我的问题是
为什么如果我调用我:
/rest/table?filter=filter1,filter2
我得到:filters = {{filter1},{filter2}}
而不是:filters = {{filter1,filter2}}
?在这种情况下,有什么方法可以获取最后一个数组而不是第一个数组?
最佳答案
在URL中发送项目列表很棘手。一般来说,要求
/rest/table?filter=A&filter=B
和
/rest/table?filter=A,B
都将被解析,就好像A和B是单独的参数一样。这是因为Spring的默认
WebDataBinder
配置为在逗号上拆分参数列表。您可以通过向 Controller 添加一些绑定(bind)程序初始化代码来禁用此默认配置。@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(
String[].class,
new StringArrayPropertyEditor(null));
}
现在,通过HTTP传入的参数列表的数据绑定(bind)过程将不会在逗号上拆分,而是被解释为单独的项。这可能会产生您要查找的行为,因此以逗号分隔的参数列表将被视为单个数组参数,而不是N个单独的单项数组参数。