文章目錄
- 》原因
- 》解決方案
》原因
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;@Overridepublic void afterPropertiesSet() {requestMappingHandlerAdapter.setWebBindingInitializer(new ConfigurableWebBindingInitializer() {@Overridepublic 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 {@InitBinderpublic void initBinder(WebDataBinder binder) {// 設置處理嵌套屬性binder.setAutoGrowNestedPaths(true);// 配置集合上限數量binder.setAutoGrowCollectionLimit(Integer.MAX_VALUE);} }