前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >研究javax.validation.constraints.NotNull运行原理

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

作者头像
老梁
发布2020-04-24 17:53:44
1.8K0
发布2020-04-24 17:53:44
举报

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

1.1. 源码跟进

  1. 为了找到NotNull到底是在哪里被处理,我先打印一个错误信息,根据错误信息的关键字,我首先找到的是这个地方,可以看到是webmvc包,可以理解,毕竟是通过接口请求并拦截的,需要经过webmvc
UTOOLS1587607490936.png
UTOOLS1587607490936.png
  1. 接下来要探究这句话是怎么产生的了,追溯body值得来源,发现最终捕获异常的地方在DispatcherServlet类的如下方法,感觉快要找到了,进入handle方法吧
UTOOLS1587608837891.png
UTOOLS1587608837891.png
  1. 继续往里面找,找到了抛MethodArgumentNotValidException异常的地方,可以看到验证参数的方法就是validateIfApplicable
UTOOLS1587609270008.png
UTOOLS1587609270008.png
  1. 进到这个方法就能看到熟悉的小伙伴了,@Validated这个注解,在需要验证的Controller接口都需要加,之后的核心验证方法为binder.validate,之后需要层层递进分叉非常多了,我就讲一条我遇到的实际问题找寻源码的路径
UTOOLS1587613176584.png
UTOOLS1587613176584.png

1.2. 问题

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

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

    /**
     * 额外请求参数,可另做处理
     */
    private Map<String,Object> extend;
}
  1. 由于深入层数过多,我会挑几个重点截图,起到抛砖引玉的作用了,想要深入了解一定要自己看源码
UTOOLS1587624273122.png
UTOOLS1587624273122.png
  1. 通过SpringValidatorAdapter验证类作为核心
UTOOLS1587624349905.png
UTOOLS1587624349905.png
  1. 接下去解析注解,中间调整过多,我会跳过几层
UTOOLS1587624476439.png
UTOOLS1587624476439.png
UTOOLS1587624659782.png
UTOOLS1587624659782.png
  1. 终于找到获取对象属性的@Valid注解
UTOOLS1587624723841.png
UTOOLS1587624723841.png
  1. 获得了这个级联元数据,后续的判断就会用到这个,设值valueContext,我把这个ExampleDeleteVo对象的id属性设值了注解@NotNull
UTOOLS1587625281444.png
UTOOLS1587625281444.png
  1. 可以看到它获取了id为null的值放入了currentValue
UTOOLS1587625338885.png
UTOOLS1587625338885.png
UTOOLS1587625547426.png
UTOOLS1587625547426.png
UTOOLS1587625611470.png
UTOOLS1587625611470.png
UTOOLS1587625762872.png
UTOOLS1587625762872.png

1.3. 总结

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-04-23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 研究javax.validation.constraints.NotNull运行原理
    • 1.1. 源码跟进
      • 1.2. 问题
        • 1.3. 总结
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档