》原因
Spring Validation
的 org.springframework.validation.DataBinder
类中默认限制,表单提交 List
元素数量超过 256
时就会抛出异常
public class DataBinder implements PropertyEditorRegistry, TypeConverter {
/** Default limit for array and collection growing: 256. */
public static final int DEFAULT_AUTO_GROW_COLLECTION_LIMIT = 256;
}
》解决方案
-
局部方案
在接口所在的
Controller
中做如下配置缺点:仅作用于当前
Controller
@InitBinder public void initBinder(WebDataBinder binder) { // 设置处理嵌套属性 binder.setAutoGrowNestedPaths(true); // 配置集合上限数量 binder.setAutoGrowCollectionLimit(Integer.MAX_VALUE); }
-
全局方案
通过
@Configuration
注解和RequestMappingHandlerAdapter
全局配置缺点:会导致枚举类上的
@JsonValue
注解作用失效,无法解析映射枚举类值@RequiredArgsConstructor @Configuration public class WebBinderConfig implements InitializingBean { private final RequestMappingHandlerAdapter requestMappingHandlerAdapter; @Override public void afterPropertiesSet() { requestMappingHandlerAdapter.setWebBindingInitializer(new ConfigurableWebBindingInitializer() { @Override public void initBinder(@NotNull WebDataBinder binder) { super.initBinder(binder); // 设置处理嵌套属性 binder.setAutoGrowNestedPaths(true); // 配置集合上限数量 binder.setAutoGrowCollectionLimit(Integer.MAX_VALUE); } }); } }
-
安全优雅方案
既想全局配置,又不影响到枚举类映射
可以通过@ControllerAdvice
和@RestControllerAdvice
配置个前置处理器,在其内部注入@InitBinder
,这样就可以作用到全局的Controller
上@ControllerAdvice @RestControllerAdvice public class ReqControllerAdvice { @InitBinder public void initBinder(WebDataBinder binder) { // 设置处理嵌套属性 binder.setAutoGrowNestedPaths(true); // 配置集合上限数量 binder.setAutoGrowCollectionLimit(Integer.MAX_VALUE); } }