一次SpringMVC接收数组参数的问题

在本地测试好好的,上测试就出问题,心累。

References:

昨晚测试说一个接口的过滤条件不生效,我看了下觉得很奇怪,这个接口自己本地测试好好的,怎么可能上了测试就不好使了。于是又用postman测了一下,还是没问题啊?接口的参数如下:
Snipaste_2019-12-06_14-14-43.png

据测试反馈,txnType这个字段的参数好像没生效,不管怎么改都没变换。我用postman测试后,发现这个字段是生效的,怎么回事?
先看下后端的接口:

@PostMapping("/history.do")
public ResultDTO history(
        @RequestParam(name="currency", required = true) String currencyStr,
        @RequestParam(name="pageNo", required = true, defaultValue = "1") Integer pageNo,
        @RequestParam(name="pageSize", required = true, defaultValue = "10") Integer pageSize,
        @RequestParam(name="accountNumber", required = true) String accountNumber,
        @RequestParam(name="txnType", required = false) String[] txnType,
        @RequestParam(name="timeFrom", required = false) Date timeFrom,
        @RequestParam(name="timeTill", required = false) Date timeTill) {
            // ……
}

这个参数是个数组类型的,这里为了支持字符串类型的数组,还添加了自定义的参数处理,因为有些人喜欢用这种方式传递数组,所以在此Controller中还有如下代码(为什么不配置成全局的?一言难尽……):

@InitBinder
public void initBinder(WebDataBinder binder) {
    // 此controller所有日期类型都会被转换
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    dateFormat.setLenient(false);
    binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true)); // true:允许输入空值,false:不能为空值

    // 所有的String数组类型都会按逗号分割
    binder.registerCustomEditor(String[].class, new StringArrayPropertyEditor(","));
}

这样就支持传递逗号分隔的字符串,程序会自动将其分割并返回数组。但是查了日志后发现,测试环境并没有接收到这个参数,由于这个参数不是必须项,所以也没有报错。于是开始怀疑是参数传递的问题,由于是前后端分离的项目,所以先看下前端传递的是什么,F12看一下,如下:
TIM图片20191206142952.png

发现这个参数有点诡异,txnType[0],如上图所示,发送的参数感觉不正常,由于前端是使用了axios发送的请求,有了关键字查询就很容易,这个问题也影响了不少人。根据参考链接的描述,axios的序列化采用了qs库序列化数组,导致了括号中带0,1,2这种数字,所以后端接收不到。其实说白了就是参数名不匹配。

按照我上面代码的配置,现在可以接收txnType=CREDIT,DEBIT或者txnType=CREDIT&txnType=DEBIT格式的参数,如果前端修改方式,传递了类似txnType[]=CREDIT&txnType[]=DEBIT这种的,那么可以将后端的接口txnType字段改成相应的@RequestParam(name="txnType[]", required = false) String[] txnType,在name中也加上括号,这样就能匹配上了。

那么找到原因解决就很容易了,前端修改下参数的传递方式就好了,至于是用逗号分隔字符串还是同名参数传递,无所谓,都能收到,效果一样,随前端喜好去吧。

标签: none

添加新评论

ali-01.gifali-58.gifali-09.gifali-23.gifali-04.gifali-46.gifali-57.gifali-22.gifali-38.gifali-13.gifali-10.gifali-34.gifali-06.gifali-37.gifali-42.gifali-35.gifali-12.gifali-30.gifali-16.gifali-54.gifali-55.gifali-59.gif

加载中……