实际情景:
数据库中有一张表,该表的字段足足有270多个!!!而这张表对应的恰好是一个银行的一个理财对象(这里就牵扯到银行的理财业务了)我们可以简单的理解为这张表就对应着银行的一项理财业务(银行的理财业务还有很多,这只是其中一个比较特殊的),而我们的系统有一个功能就是要配置这一项理财业务;
顾名思义要配置就要获取这张表的所有字段,然后对这些字段进行一些设置,以便后期在页面上录入数据的时候只需要按照我们配置的要求录入即可;
1 提交参数
前端提交的参数是一个json格式如下:(情况一样)
columsList 在后台controller的方法中是一个pojo的属性:
//第一种
{
"tableName": "XXX_TABLE",
"ownerName": "XXX",
"...": "...",
"columnsList": [
"xxx1",
"xxx2",
"xxx3",
"xxx4",
"xxx5",
"xxx6",
"..."
]
}
//第二种
{
"tableName": "XXX_TABLE",
"ownerName": "XXX",
"columnsList[0]": "xxx0",
"columnsList[1]": "xxx0",
"columnsList[2]": "xxx0",
"columnsList[3]": "xxx0",
"columnsList[4]": "xxx0",
"columnsList[m]": "xxxm",
"columnsList[...]": "xxx..."
}
2 后台controller接收参数格式
使用的pojo实体进行的接受,格式如下
class DemoPojo{
private String tableName;
priate String ownerName;
private List<ColumnInfo> columnsList;
...
}
3 抛出异常信息
异常信息如下:
org.springframework.beans.InvalidPropertyException: Invalid property 'columnsList[256]' of bean class [com.suning.asvp.mer.entity.InviteCooperationInfo]: Index of out of bounds in property path 'columnsList[256]'; nested exception is java.lang.IndexOutOfBoundsException: Index: 256, Size: 256
4 抛出异常原因
查看Spring源码中可以看到如下代码:
public class DataBinder implements PropertyEditorRegistry, TypeConverter {
public static final String DEFAULT_OBJECT_NAME = "target";
public static final int DEFAULT_AUTO_GROW_COLLECTION_LIMIT = 256;
protected static final Log logger = LogFactory.getLog(DataBinder.class);
public DataBinder(@Nullable Object target, String objectName) {
this.directFieldAccess = false;
this.ignoreUnknownFields = true;
this.ignoreInvalidFields = false;
this.autoGrowNestedPaths = true;
this.autoGrowCollectionLimit = 256;
this.bindingErrorProcessor = new DefaultBindingErrorProcessor();
this.validators = new ArrayList();
this.target = ObjectUtils.unwrapOptional(target);
this.objectName = objectName;
}
//...
public void setAutoGrowCollectionLimit(int autoGrowCollectionLimit) {
Assert.state(this.bindingResult == null, "DataBinder is already initialized - call setAutoGrowCollectionLimit before other configuration methods");
this.autoGrowCollectionLimit = autoGrowCollectionLimit;
}
}
上面代码可以看出默认在Spring中我们的集合中可以增长的个数只能0-255也就是256个,多了就会抛出索引越界的异常,
由此可见我们异常产生的原因就是这里的问题
5 解决
网上解决思路很多,但是这里我是使用的是最简单的一种方式
在Controller 中添加如下方法:
@RestController
@RequestMapping("/demo")
class DemoController{
//.....此处省去其他业务代码
//添加方法覆盖Spring默认的集合自增长最大长度(性能优化)
@InitBinder
public void initListBinder(WebDataBinder binder)
{
// 设置需要包裹的元素个数,默认为256
binder.setAutoGrowCollectionLimit(1024);
}
}
6 小结
注意只有在使用Spring或者SpringBoot框架的时候才会遇到此问题,其实解决思路不只有这一种比如:
1 将这些数组的参数在前端拼接成字符串传到后台,然后截取;
2 将整个json前端转换成json字符串,后台使用一个String类型变量接受,之后转换成pojo或者Map
…