出现的场景是: 前端 提交一个form 里面包含 一个list里面的对象有 427 个
[img]http://dl2.iteye.com/upload/attachment/0127/0758/83ce0ddb-8efb-3cf0-8865-d14a18b8937f.png[/img]
注意其中的一个类 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
[img]http://dl2.iteye.com/upload/attachment/0127/0758/83ce0ddb-8efb-3cf0-8865-d14a18b8937f.png[/img]
注意其中的一个类 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>