研究javax.validation.constraints.NotNull运行原理

1. 研究javax.validation.constraints.NotNull运行原理

1.1. 源码跟进

  1. 为了找到 NotNull 到底是在哪里被处理,我先打印一个错误信息,根据错误信息的关键字,我首先找到的是这个地方,可以看到是webmvc包,可以理解,毕竟是通过接口请求并拦截的,需要经过webmvc

研究javax.validation.constraints.NotNull运行原理

  1. 接下来要探究这句话是怎么产生的了,追溯body值得来源,发现最终捕获异常的地方在 DispatcherServlet 类的如下方法,感觉快要找到了,进入handle方法吧

研究javax.validation.constraints.NotNull运行原理

  1. 继续往里面找,找到了抛 MethodArgumentNotValidException 异常的地方,可以看到验证参数的方法就是 validateIfApplicable

研究javax.validation.constraints.NotNull运行原理

  1. 进到这个方法就能看到熟悉的小伙伴了, @Validated 这个注解,在需要验证的Controller接口都需要加,之后的核心验证方法为 binder.validate ,之后需要层层递进分叉非常多了,我就讲一条我遇到的实际问题找寻源码的路径

研究javax.validation.constraints.NotNull运行原理

1.2. 问题

  1. 只是在 controller 层,写个 @Validated 注解,之后的 @NotNull 判断等注解判断只在 @Validated 定义的对象生效,现在我想要实现 对象中的对象也实现验证效果 ,我这里直接说结论了,我写了如下类,我需要body对象也能够得到参数验证,则在类方法上加个 @Valid 注解即可实现,接下去看源码
@Data
public class Request<T> {
    /**
     * 请求体
     */
    @Valid
    private T body;

    /**
     * 请求码(预留可不填)
     */
    private Integer requestCode;

    /**
     * 额外请求参数,可另做处理
     */
    private Map<String,Object> extend;
}
  1. 由于深入层数过多,我会挑几个重点截图,起到抛砖引玉的作用了,想要深入了解一定要自己看源码

研究javax.validation.constraints.NotNull运行原理

  1. 通过 SpringValidatorAdapter 验证类作为核心

    研究javax.validation.constraints.NotNull运行原理

  2. 接下去解析注解,中间调整过多,我会跳过几层

研究javax.validation.constraints.NotNull运行原理

研究javax.validation.constraints.NotNull运行原理

  1. 终于找到获取对象属性的 @Valid 注解

    研究javax.validation.constraints.NotNull运行原理

  2. 获得了这个级联元数据,后续的判断就会用到这个,设值 valueContext ,我把这个 ExampleDeleteVo 对象的id属性设值了注解 @NotNull

研究javax.validation.constraints.NotNull运行原理

  1. 可以看到它获取了id为null的值放入了 currentValue
    研究javax.validation.constraints.NotNull运行原理

研究javax.validation.constraints.NotNull运行原理

研究javax.validation.constraints.NotNull运行原理

研究javax.validation.constraints.NotNull运行原理

1.3. 总结

一开始我研究 @Validated 注解就是为了找是否有办法验证对象内对象,如果不行可能就需要自己写拦截器方法了,不到迫不得已我也不想重复造轮子,毕竟 @Validated 自带的验证这么多,写起来也蛮累的,还容易出bug。有耐心看完这篇文章的估计是遇到 @Vaildated 的问题了,希望能起到抛砖引玉的作用吧

原文 

https://www.maiyewang.com/archives/91465

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » 研究javax.validation.constraints.NotNull运行原理

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址