相信一般的Spring MVC前后端数据传输与解析,大家都有一定的经验了,这里主要说一个特殊场景。
后台拿不到前端请求的数组的一种情况。

一般场景

我在前端构建了一个数组(以”str[]”为例),作为ajax请求参数到后台。
一般而言,我们在F12中可以看到这个请求,并且之前的请求参数(str[])应该可以折叠展开,观察到它的
每一个下标以及对应的值。

java后端多参数接收 java后端接收数组_java后端多参数接收

java后端多参数接收 java后端接收数组_请求参数_02


(这里只是找到一个类似的数据例子,大家把list命名看成contact,以及里面的成员变量为nameaddressisUsual

如上图,一般情况如上所示,而我们在后台java bean会有一个String[] str或者List<String> strList成员变量。

java后端多参数接收 java后端接收数组_java后端多参数接收_03

(这里还是以上面contact为例)

经过上面前端构造请求,到后台Spring解析绑定参数,拿到这个list数组,然后我们就可以进行后续的业务逻辑编写了。


特殊场景

有的时候在前端我们不一定是拿已有的数组作为参数,我们需要自己构造一些特定的数组给后台。

var contact = []; //我们建议用中括号[]构造数组,而不是new Array(),具体原由大家可以自行百度,这里不再赘述。

这样构造得到一个数组后,作为参数传递到后台,此时请求参数是什么样子呢?让我们F12看一看。

java后端多参数接收 java后端接收数组_请求参数_04

(这里偷懒成员变量只构造1个数值了: P)

我们可以看到此时的数组参数,后面带有一个[],然后并没有我们想象中的下标0,例如我们可能希望它应该是contact[0]:1这样的。
而出现上述场景后,后台使用List<String> strList成员变量时,将会拿不到数组而报空指针异常Nullpointexception
如过使用String[] str成员变量,则会报NumberFormatException ,如下图:

java后端多参数接收 java后端接收数组_java后端多参数接收_05

显然,我们可以看到Spring在解析绑定这个数组数据时,拿不到数组下标,也就无法遍历获取数据值进行参数绑定了。


场景已重现,下面是解决方案,依然视场景而定:

1、 form表单请求,手动拼接数组

<form>
    <input name="contact[0].name" value="1">
    <input name="contact[1].name" value="2">
</form>

这样拼接而成的数据,如上面一般场景中提到的格式类似,后台可以正常解析。

2、Ajax Json格式传输参数

如果使用ajax请求构造参数,那么使用JSON.stringify(data)对参数进行Json格式化,则请求参数变为下图的样子:

java后端多参数接收 java后端接收数组_java后端多参数接收_06

这里JSON.stringify(data)对数组格式化重新封装时自动分配了下标,所以此时的数据来到后台,我们就可以正常解析绑定了。