SpringBoot 表单提交参数绑定 List 下标越界,超过 256,报数组越界异常

》原因

Spring Validationorg.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);
        }
    }
    
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值