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

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

1.1. 源码跟进

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

43aff5f08b9dae361162b778f6efc9df.png

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

bf3aac20f608ff8c8549142c5b763692.png

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

d7a610faa72f4859e6f13b791cda9c05.png

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

72a9393187a9842d4c9c51b81054d7b7.png

1.2. 问题

只是在controller层,写个@Validated注解,之后的@NotNull判断等注解判断只在@Validated定义的对象生效,现在我想要实现对象中的对象也实现验证效果,我这里直接说结论了,我写了如下类,我需要body对象也能够得到参数验证,则在类方法上加个@Valid注解即可实现,接下去看源码

@Data

public class Request {

/**

* 请求体

*/

@Valid

private T body;

/**

* 请求码(预留可不填)

*/

private Integer requestCode;

/**

* 额外请求参数,可另做处理

*/

private Map extend;

}

由于深入层数过多,我会挑几个重点截图,起到抛砖引玉的作用了,想要深入了解一定要自己看源码

af62e76eb921b17d01c096e2673677f2.png

通过SpringValidatorAdapter验证类作为核心

eecb4e4b38d1e72ee590ecaee8801f9a.png

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

c43c2c11c557f7aab789493308cdcea5.png

beb14eb5a6eec300655c5049ecd16668.png

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

63b1e5a8ec9c76c5596569fb5ef888f0.png

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

8b86ebc04da59a68b6679ec83572224d.png

可以看到它获取了id为null的值放入了currentValue

5587d92e6dcf27e983ddd64b0647c05e.png

57af5e6bccadfa26b948f48efcfbb982.png

4c3f6b77993d82b3c897eefcde027679.png

300e7376f3f486e98c20e42a65b57482.png

1.3. 总结

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值