研究javax.validation.constraints.NotNull运行…
2020-04-23 16:05:17来源:博客园 阅读 ()
研究javax.validation.constraints.NotNull运行原理
1. 研究javax.validation.constraints.NotNull运行原理
1.1. 源码跟进
- 为了找到
NotNull
到底是在哪里被处理,我先打印一个错误信息,根据错误信息的关键字,我首先找到的是这个地方,可以看到是webmvc包,可以理解,毕竟是通过接口请求并拦截的,需要经过webmvc
- 接下来要探究这句话是怎么产生的了,追溯body值得来源,发现最终捕获异常的地方在
DispatcherServlet
类的如下方法,感觉快要找到了,进入handle方法吧
- 继续往里面找,找到了抛
MethodArgumentNotValidException
异常的地方,可以看到验证参数的方法就是validateIfApplicable
- 进到这个方法就能看到熟悉的小伙伴了,
@Validated
这个注解,在需要验证的Controller接口都需要加,之后的核心验证方法为binder.validate
,之后需要层层递进分叉非常多了,我就讲一条我遇到的实际问题找寻源码的路径
1.2. 问题
- 只是在
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
- 可以看到它获取了id为null的值放入了
currentValue
1.3. 总结
一开始我研究@Validated
注解就是为了找是否有办法验证对象内对象,如果不行可能就需要自己写拦截器方法了,不到迫不得已我也不想重复造轮子,毕竟@Validated
自带的验证这么多,写起来也蛮累的,还容易出bug。有耐心看完这篇文章的估计是遇到@Vaildated
的问题了,希望能起到抛砖引玉的作用吧
原文链接:https://www.cnblogs.com/sky-chen/p/12761247.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 你说研究过Spring里面的源码,循环依赖你会么? 2020-06-09
- COLA的扩展性使用和源码研究 2020-05-25
- 2020华为春招Java软件开发岗华为南京研究所公共开发部+面经 2020-05-07
- spring源码分析系列4:ApplicationContext研究 2019-10-12
- spring源码分析系列3:BeanFactory核心容器的研究 2019-10-09
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash