一、JSR303/JSR-349,hibernate validation,spring validation,dubbo validation 之间的关系

数据的校验是交互式网站一个不可或缺的功能,前端的 js 校验可以涵盖大部分的校验职责,如用户名唯一性,生日格式,邮箱格式校验等等常用的校验。但是为了避免用户绕过浏览器,使用 http 工具直接向后端请求一些违法数据,服务端的数据校验也是必要的,可以防止脏数据落到数据库中,如果数据库中出现一个非法的邮箱格式,也会让运维人员头疼不已。我在之前保险产品研发过程中,系统对数据校验要求比较严格且追求可变性及效率,曾使用 drools 作为规则引擎,兼任了校验的功能。而在一般的应用,可以使用本文将要介绍的 validation 来对数据进行校验。

简述 JSR303/JSR-349,hibernate validation,spring validation 之间的关系。JSR303 是一项标准,JSR-349 是其的升级版本,添加了一些新特性,他们规定一些校验规范即校验注解,如 @Null,@NotNull,@Pattern,他们位于 javax.validation.constraints 包下,只提供规范不提供实现。而 hibernate validation 是对这个规范的实践(不要将 hibernate 和数据库 orm 框架联系在一起),他提供了相应的实现,并增加了一些其他校验注解,如 @Email,@Length,@Range 等等,他们位于 org.hibernate.validator.constraints 包下。而万能的 spring 为了给开发者提供便捷,对 hibernate validation 进行了二次封装,显示校验 validated bean 时,你可以使用 spring validation 或者 hibernate validation,而 spring validation 另一个特性,便是其在 springmvc 模块中添加了自动校验,并将校验信息封装进了特定的类中。这无疑便捷了我们的 web 开发。本文主要介绍在 springmvc 中自动校验的机制。

二、spring validation

2.1 使用

  1. 我们只需要引入 spring-boot-starter-web 依赖即可,如果查看其子依赖,可以发现如下的依赖:

2) 使用注解并使用@Validated 开启校验

3)@Valid和@Validated区别

2.2 原理

在spring-mvc中,RequestResponseBodyMethodProcessor是用于解析@RequestBody标注的参数以及处理@ResponseBody标注方法的返回值的。显然,执行参数校验的逻辑肯定就在解析参数的方法resolveArgument()中:

可以看到,resolveArgument()调用了validateIfApplicable()进行参数校验。

看到这里,明白为什么这种场景下@Validated、@Valid两个注解可以混用。我们接下来继续看WebDataBinder.validate()实现。最终发现底层最终还是调用了Hibernate Validator进行真正的校验处理。

实际上,不管是requestBody参数校验还是方法级别的校验,最终都是调用Hibernate Validator执行校验,Spring Validation只是做了一层封装。

springboot在WebMvcAutoConfiguration 自动引入了validator的bean,这个bean最终会被RequestResponseBodyMethodProcessor引用并用作校验参数。

参考:Spring Validation最佳实践及其实现原理,参数校验没那么简单!

三、dubbo validation

3.1 使用

参数验证功能 是基于 JSR303 实现的,用户只需标识 JSR303 标准的验证 annotation,并通过声明 filter 来实现验证 。

<dubbo:reference id="validationService" interface="org.apache.dubbo.examples.validation.api.ValidationService" validation="true" />

只要在dubbo注册时配置validation = true。 并在参数上使用 JSR303 标准的验证 annotation 就可以生效了

3.2 原理

dubbo启用参数验证要依赖hiberate-validator包,最终底层八成也是调用Hibernate Validator执行校验

参考:在 Dubbo 中进行参数验证

JSR303及其实现相关推荐

  1. JSR-303 Bean Validation 介绍及 Spring MVC 服务端验证最佳实践

    任何时候,当要处理一个应用程序的业务逻辑,数据校验是你必须要考虑和面对的事情. 应用程序必须通过某种手段来确保输入参数在上下文来说是正确的. 分层的应用在很多时候,同样的数据验证逻辑会出现在不同的层, ...

  2. Spring Boot 2.x基础教程:JSR-303实现请求参数校验

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 作者 | 翟永超 来源 | didispace.com/spring-boot-learni ...

  3. JSR303—Bean Validation验证

    JSR-303 Bean Validation 是 JAVA EE 6 中的一项子规范 官方参考实现是Hibernate Validator 此实现与 Hibernate ORM 没有任何关系 Bea ...

  4. SpringBoot-服务端参数验证-JSR-303验证框架

    1. springboot 默认集成了 hibernate-validator,它默认是生效的,可以直接使用. 比如: @RestController @RequestMapping("/h ...

  5. springboot获取payload_Spring Boot 使用 JSR303 实现参数验证

    文章首发于公众号<程序员果果> 地址 : http://blog.itwolfed.com/blog/97 简介 JSR-303 是 JAVA EE 6 中的一项子规范,叫做 Bean V ...

  6. Java数据校验(Bean Validation / JSR303)

    文档: http://beanvalidation.org/1.1/spec/ API : http://docs.jboss.org/hibernate/beanvalidation/spec/1. ...

  7. 品牌管理-JSR303数据校验

    JSR303 1).给Bean添加校验注解:javax.validation.constraints,并定义自己的message提示 2).开启校验功能@Valid效果:校验错误以后会有默认的响应: ...

  8. 数据验证和JSR303

    数据格式化 日期类:Employee.java添加birth字段,setter/getter并重写toString.在录入页面展现 输入abcccccccccccc看看 如何解决 标配<mvc: ...

  9. jsr303 spring_使用Spring和JSR 303进行方法参数验证

    jsr303 spring Spring提供了一种使用JSR 303 bean验证来验证方法参数的简便方法. 在这篇文章中,我们将看到如何使用此功能. 建立 首先,我们需要通过创建MethodVali ...

  10. jsr303自定义验证_JSR 310新日期/时间API的自定义JSR 303 Bean验证约束

    jsr303自定义验证 借助JSR 310,Java 8终于为我们带来了不错的日期和时间API. 对于仍在使用Java 7的那些人(就像我目前在我的当前项目中一样),有很好的反向移植,请访问www.t ...

最新文章

  1. Thrift架构~thrift中间语言的认识(只有它什么都不是,它才有可能什么都是)
  2. Android MagicIndicator系列之一 —— 使用MagicIndicator打造千变万化的ViewPager指示器...
  3. Spring boot中最大连接数、最大线程数与最大等待数在生产中的异常场景
  4. python的py文件打包成exe_将python项目.py文件打包成.exe文件
  5. PHP学习——定界符格式引起的错误
  6. Ubuntu18 Win10搭建Caffe训练识别mnist手写数字demo
  7. mysqldump导出数据库视图_mysql中如何用mysqldump批量如何导出视图view啊?
  8. Linux下通过jstat命令查看jvm的GC情况
  9. 使用单例模式实现自己的HttpClient工具类
  10. 【论文写作】毕业论文写作——摘要篇
  11. 纪念非线性光学诞生:Peter Franken和非线性光学
  12. html象棋游戏源码分享
  13. 高通CAMERA 调试
  14. win32 应用程序更换icon图标
  15. CWE ID 470:Use of Externally-Controlled Input to Select Classes or Code (‘Unsafe Reflection‘)
  16. 解决Vue项目: verbose stack Error: unable to resolve dependency tree
  17. RHCE 考试经验总结
  18. 2021汽车行业内容营销白皮书
  19. 使用python调用nmap模块实现端口扫描
  20. php根据淘宝短链接获取商品ID

热门文章

  1. 【Web开发及人机交互导论】格式化文件
  2. 基本webpack.config.js配置和packag.json配置
  3. 本地安全策略账户锁定阈值设置
  4. mysql latin1默认_为什么mysql 默认的test数据库character是latin1不是utf8
  5. 爬虫的基础架构及常用的工具介绍
  6. MPC5744-SPI
  7. 【转】【中级财管精华】递延年金现值公式的理解
  8. 【OpenGL】笔记二十四、立方体贴图
  9. 全面二胎出现生育断崖,利用大数据分析来解读我国生育危机!
  10. html怎么用视频做网页背景图片,使用视频作为网页背景的技术探讨