java.lang.IndexOutOfBoundsException: Index: 256, Size: 256
程序员文章站
2022-05-28 16:14:23
...
出现的场景是: 前端 提交一个form 里面包含 一个list里面的对象有 427 个
注意其中的一个类 DataBinder.java:859
进入后看到
public static final int DEFAULT_AUTO_GROW_COLLECTION_LIMIT = 256;
解决办法
1)修改业务,不允许一次提交超过256条数据
2)在需要的Action中添加InitBinder方法。如果所有Action都需要添加……不仅工作量很大,而且代码冗余很难看
3)增加一个WebBindingInitializer类,并在xml中配置。推荐大笑(如果你不知道改哪个xml文件,先好好学习一下SpringMVC吧奋斗)
spring-bean.xml
注意其中的一个类 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>