@RequestParam数组映射问题

问题描述 投票:2回答:2

我正在使用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}}

在那种情况下,有没有办法获得最后一个数组而不是第一个数组?

java spring
2个回答
3
投票

发送URL中的项目列表很棘手。一般来说,请求

/rest/table?filter=A&filter=B

/rest/table?filter=A,B

将被解析,就像A和B是单独的参数一样。这是因为Spring的默认WebDataBinder配置为在逗号上拆分参数列表。您可以通过向控制器添加一些活页夹初始化代码来禁用此默认配置。

@InitBinder
public void initBinder(WebDataBinder binder) {
    binder.registerCustomEditor(
        String[].class,
        new StringArrayPropertyEditor(null)); 
}

现在,通过HTTP传入的参数列表的数据绑定过程不会在逗号上拆分,而是被解释为单独的项目。这可能会产生您正在寻找的行为,因此逗号分隔的参数列表将被视为单个数组参数,而不是N个单独的单项数组参数。


1
投票

而不是仅禁用逗号作为分隔符的使用,为了覆盖管道使用逗号分隔符,我执行了以下操作:

1 - 创建了一个扩展PropertyEditorSupport的类,将分隔符设置为管道。

public class StringListPropertyEditor extends PropertyEditorSupport {

    public static final String DEFAULT_SEPARATOR = "\\|";

    @Override
    public void setAsText(String text) throws IllegalArgumentException {

        List<String> theList = Arrays.asList(text.split(DEFAULT_SEPARATOR));

        setValue(theList);

    }


}

2 - 在我的控制器上创建了一个InitBinder,它将我的PropertyEditor注册为CustomEditor

@InitBinder
    public void initBinder(WebDataBinder binder) {
        binder.registerCustomEditor(List.class, new StringListPropertyEditor());
    }
© www.soinside.com 2019 - 2024. All rights reserved.