java - @RequestParam 数组映射问题

标签 java spring

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

好吧,我希望过滤器是一个具有特定结构的二维数组:

如果我用这个 url /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 添加一些 Binder 初始化代码来禁用此默认配置。

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

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

关于java - @RequestParam 数组映射问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23695817/

相关文章:

java - 如何在spring mongotemplate中存储mongodb聚合查询结果?

java - Spring MVC @ModelAttribute 方法返回 "Bad request"400

java - 'java.lang.LinkageError : loader constraint violation:' error occurred when restarting Springboot project

java - 将 SQL 语句保存在属性文件中是一种好习惯吗? - Java/ Spring

java - 如何使用 eclipse 在云上进行开发?

java - 由于不推荐使用 Android getFragmentManager() API,还有其他选择吗?

java - 有人可以帮助我告诉我以下算法的复杂性吗?

java - 如何将 "Mon Jun 18 00:00:00 IST 2012"转换为 18/06/2012?

java - Java接口(interface)发布后可以修改吗

spring - 使用Grails 3.2.3的log4j:我没有任何日志记录