首先声明下我的环境,spring版本是4.3.2,框架是springmvc+mybatis,前端是easyui.
今天遇到个诡异的问题,就是前台在保存的时候,后台报错,提示类似如下信息:
org.springframework.beans.InvalidPropertyException : Invalid property 'list[256]' of bean class [com.AppController]: Index of out of bounds in property path 'list[256]'; nested exception is java.lang.IndexOutOfBoundsException: Index: 256, Size: 256
之前也遇到过类似的问题,但是前台是可以保存的,只不过保存的内容被截取了,只保存了部分数据,当时处理的方式是修改tomcat的server.xml的配置,
原配置:
改后的配置:
compression="on" executor="tomcatThreadPool" URIEncoding="utf-8"
compressableMimeType="text/html,text/xml,text/Javascript,text/css,text/plain"
noCompressiOnUserAgents="gozilla, traviata" compressiOnMinSize="50" maxParameterCount="1000000"/>
当发现问题时,于是去查看tomcat的配置,结果发现已经添加了这些配置,但是仍旧不行。细想一下,两者是有区别的,改tomcat配置的情况,不是保存不了,是保存成功,但是保存不完全,而现在的问题是直接保存不了。
后来发现现在的程序中spring用的是4.3.2版本,而之前是3.0.5。然后去网上搜了很多资料,都说使用binder.setAutoGrowCollectionLimit(Integer.MAX_VALUE); 解决,但是setAutoGrowCollectionLimit这个方法貌似在spring4.x版本提供的,也就是说3.x版本没有这个方法,所以对于spring3.x版本,springmvc应该不会存在这个问题。
到了spring4.x这个值的默认值是256,所以需要重写这个方法,具体步骤如下:
1.添加如下类:
public class MyWebBindingInitializer implements WebBindingInitializer {
@Override
public void initBinder(WebDataBinder binder, WebRequest request) {
binder.setAutoGrowCollectionLimit(Integer.MAX_VALUE);
binder.registerCustomEditor(Date.class, new DateConvertPropertyEditor());
}
}
2.在dispatch-servlet.xml中注入bean
就这么简单的搞定了。
另外需要注意一个坑,就是spring4.3.5版本之前,
binder.setAutoGrowCollectionLimit(Integer.MAX_VALUE);
binder.registerCustomEditor(Date.class, new DateConvertPropertyEditor());
两句的顺序不能颠倒,颠倒之后,setAutoGrowCollectionLimit不起作用。这个在spring4.3.5版本中修复了。