问题
- 在开发过程中,一般使用@Valid对controller层提交的参数进行校验,形如:method(@RequestBody @Valid T request),此时T中的@Length、@NotNull等校验的注解会起作用。但如果是批量的提交,形如:method(@RequestBody @Valid List<T> requests),此时T中的@Length、@NotNull等校验的注解是不起作用的
解决方案
- 为Collection创建一个自定义的Validator,并通过@ControllerAdvice的方式,将自定义的Validator注册到WebDataBinders中
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));
}
}
}
参考链接