java.lang.IndexOutOfBoundsException: Index: 256, Size: 256

出现的场景是: 前端 提交一个form 里面包含 一个list里面的对象有 427 个



注意其中的一个类  DataBinder.java:859

进入后看到
public static final int DEFAULT_AUTO_GROW_COLLECTION_LIMIT = 256;
 */
public class DataBinder implements PropertyEditorRegistry, TypeConverter {

	/** Default object name used for binding: "target" */
	public static final String DEFAULT_OBJECT_NAME = "target";

	/** Default limit for array and collection growing: 256 */
	public static final int DEFAULT_AUTO_GROW_COLLECTION_LIMIT = 256;


	/**
	 * We'll create a lot of DataBinder instances: Let's use a static logger.
	 */
	protected static final Log logger = LogFactory.getLog(DataBinder.class);

	private static Class<?> javaUtilOptionalClass = null;

	static {
		try {
			javaUtilOptionalClass =
					ClassUtils.forName("java.util.Optional", DataBinder.class.getClassLoader());
		}
		catch (ClassNotFoundException ex) {
			// Java 8 not available - Optional references simply not supported then.	


解决办法
1)修改业务,不允许一次提交超过256条数据
2)在需要的Action中添加InitBinder方法。如果所有Action都需要添加……不仅工作量很大,而且代码冗余很难看
//在当前Controller中加 或者 在 BaseController 中加入
@InitBinder  
public void initBinder(WebDataBinder binder) {  
    binder.setAutoGrowCollectionLimit(Integer.MAX_VALUE);  
}  


//或者 采用  @ControllerAdvice
package cn.mwee.wpos.report.aspect;

import cn.mwee.wpos.common.config.AppConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.ServletRequestDataBinder;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.InitBinder;

import javax.servlet.http.HttpServletRequest;

/**
 * Created by luob on 2017/9/21.
 */
@ControllerAdvice
public class CollectionGrowLimitAdvice {
    @Autowired
    private AppConfig appConfig;

    @InitBinder
    public void initBinder(WebDataBinder binder) {
        binder.setAutoGrowCollectionLimit(appConfig.getCollectionGrowLimit());
    }
}


3)增加一个WebBindingInitializer类,并在xml中配置。推荐大笑(如果你不知道改哪个xml文件,先好好学习一下SpringMVC吧奋斗)
public class DataBindingInitializer implements WebBindingInitializer {  
    @Override  
    public void initBinder(WebDataBinder binder, WebRequest request) {  
        binder.setAutoGrowCollectionLimit(Integer.MAX_VALUE);  
    }  
}  


spring-bean.xml
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">  
    <property name="webBindingInitializer">  
        <bean class="xxx.DataBindingInitializer"/>  
    </property>  
</bean> 

猜你喜欢

转载自takeme.iteye.com/blog/2393986