NotNull
到底是在哪里被处理,我先打印一个错误信息,根据错误信息的关键字,我首先找到的是这个地方,可以看到是webmvc包,可以理解,毕竟是通过接口请求并拦截的,需要经过webmvcDispatcherServlet
类的如下方法,感觉快要找到了,进入handle方法吧MethodArgumentNotValidException
异常的地方,可以看到验证参数的方法就是validateIfApplicable
@Validated
这个注解,在需要验证的Controller接口都需要加,之后的核心验证方法为binder.validate
,之后需要层层递进分叉非常多了,我就讲一条我遇到的实际问题找寻源码的路径controller
层,写个@Validated
注解,之后的@NotNull
判断等注解判断只在@Validated
定义的对象生效,现在我想要实现对象中的对象也实现验证效果,我这里直接说结论了,我写了如下类,我需要body对象也能够得到参数验证,则在类方法上加个@Valid
注解即可实现,接下去看源码@Data
public class Request<T> {
/**
* 请求体
*/
@Valid
private T body;
/**
* 请求码(预留可不填)
*/
private Integer requestCode;
/**
* 额外请求参数,可另做处理
*/
private Map<String,Object> extend;
}
SpringValidatorAdapter
验证类作为核心
@Valid
注解
valueContext
,我把这个ExampleDeleteVo
对象的id属性设值了注解@NotNull
currentValue
一开始我研究@Validated
注解就是为了找是否有办法验证对象内对象,如果不行可能就需要自己写拦截器方法了,不到迫不得已我也不想重复造轮子,毕竟@Validated
自带的验证这么多,写起来也蛮累的,还容易出bug。有耐心看完这篇文章的估计是遇到@Vaildated
的问题了,希望能起到抛砖引玉的作用吧