一、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. 准备mysql函数库和PHP文件
  2. 【调查】您对计算机培训感兴趣吗?
  3. unity 让一个数按一秒累加_万物皆数—深挖UWA Benchmark之渲染篇
  4. 其他平台上测试工具的使用
  5. 快速学习EndNote X7
  6. html中怎么选择相同的代码,不同的HTML,相同的代码隐藏和相同的控件
  7. linux下C语言中的flock函数用法
  8. Linux文件句柄占用数量查看与设置
  9. LeetCode刷题——27. 移除元素
  10. win7 64位共享打印机
  11. python基础知识2——基本的数据类型——整型,长整型,浮点型,字符串
  12. Jasypt 开源加密库使用教程
  13. c++类之间的基本关系
  14. 类对象和类指针以及类的内存分布
  15. linux免安装mysql_Linux 配置mysql 免安装版。
  16. 干眼症久治不愈?反复发作,小心可能不是干眼症!
  17. 在Windows Server 2003企业版下让移动硬盘自动显示盘符
  18. 佛罗里达大学计算机工程硕士要求,佛罗里达大学计算机工程理学硕士研究生申请要求及申请材料要求清单...
  19. 【数学模型】基于Matlab模拟超市排队系统
  20. J2SE 1.5的for增强循环

热门文章

  1. 关于宽带上传速率与下载速率相关知识点
  2. 呼叫中心系统成本及定价方式
  3. jQuery fadeIn(),fadeOut()和fadeTo()示例
  4. 1-9 jquery fadeTo不透明度
  5. Excel:自动隐藏错误结果的显示信息(转)
  6. ISMAR 2020 | Mobile3DRecon 论文梳理
  7. iOS 11 : CORE ML—浅析
  8. 论文摘要写作(来自维基百科)
  9. Tensorflow TFRecord: Can't parse serialized example
  10. VS2017+Fortran(Intel Parallel Studio XE 2018)+MPI