spring - @Valid List不生效问题

2,828 阅读1分钟

问题

  • 在开发过程中,一般使用@Valid对controller层提交的参数进行校验,形如:method(@RequestBody @Valid T request),此时T中的@Length、@NotNull等校验的注解会起作用。但如果是批量的提交,形如:method(@RequestBody @Valid List<T> requests),此时T中的@Length、@NotNull等校验的注解是不起作用的

解决方案

  • 为Collection创建一个自定义的Validator,并通过@ControllerAdvice的方式,将自定义的Validator注册到WebDataBinders中
/**
 * <p>jsr-303不支持controller层集合参数的校验,此类实现此功能,只要在集合前面加上 @Valid即可验证List的参数</p>
 */
public class CollectionValidator implements Validator {

    private final LocalValidatorFactoryBean validator;

    public CollectionValidator(LocalValidatorFactoryBean validator) {
        this.validator = validator;
    }


    @Override
    public boolean supports(Class<?> clazz) {
        return Collection.class.isAssignableFrom(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {
        Collection collection = (Collection) target;
        if (CollectionUtils.isNotEmpty(collection)) {
            for (Object object : collection) {
                ValidationUtils.invokeValidator(validator, object, errors);
            }
        }
    }
}
@ControllerAdvice
public class ValidatorAdvice {

    @Autowired
    protected LocalValidatorFactoryBean validator;


    @InitBinder
    public void initBinder(WebDataBinder binder) {
        if (binder.getTarget() instanceof Collection) {
            binder.addValidators(new CollectionValidator(validator));
        }

    }
}

参考链接