问题论述:
以后对于controller层的request的参数校验,常常会应用到javax.validation包下的@Valid注解,在对应的javabean中应用各种javax.validation.constraints下的各种注解实现校验。
然而当传输参数为list或者其余非object的collection时,会发现校验并不失效。
起因是这种形式是通过
org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor调用的org.hibernate.validator.internal.engine.ValidatorImpl中的validate办法进行校验,但仅仅只会校验object的各个属性,并不会校验list中的各个elements。
解决方案:配合@Validated应用@Valid
将@Validated搁置在controller类上,同时持续应用@Valid和@requestBody在申请参数前,此时这种形式会通过
org.springframework.validation.beanvalidation.MethodValidationInterceptor调用org.hibernate.validator.internal.engine.ValidatorImpl中的validateParameters办法,该办法会校验list中的各个element。
区别:
传统的第一种形式会间接抛出400。第二种形式是经由controller类抛出ConstraintViolationException,第二种形式是更加普适的能够用于所有的类中办法的参数校验,并不专用于controller层,如果想取得相似第一种形式的exception,须要在@RestControllerAdvice的globalhandler做一下异样解决。
其余计划:
1️能够尝试将传输的参数变为object,继而将list作为object的一个field,然而这种形式会要求调用方做相应的改变。
2️将list变为一个javabean,实现相似如下:
@Data
public class ValidList<E> implements List<E> {
@Valid@Delegateprivate List<E> list = new ArrayList<>();
}