亲爱的小伙伴们我来填坑啦,java中优雅的参数校验方法中的校验的实现原理。

1.前言

验证数据是发生在所有应用程序层(从表示层到持久层)的常见任务。通常在每一层中实现相同的验证逻辑,这既耗时又容易出错。为了避免重复这些验证,开发人员经常将验证逻辑直接捆绑到域模型中,将域类与验证代码混淆,验证代码实际上是关于类本身的元数据。

JSR 380 - Bean Validation 2.0 - 定义了用于实体和方法验证的元数据模型和 API。默认元数据源是注释,能够通过使用 XML 覆盖和扩展元数据。API 不依赖于特定的应用程序层或编程模型。它特别不依赖于 Web 或持久层,并且可用于服务器端应用程序编程以及富客户端 Swing 应用程序开发人员。

Hibernate Validator 是这个 JSR 380 的参考实现。实现本身以及 Bean Validation API 和 TCK 都是在Apache Software License 2.0下提供和分发的 。

Hibernate Validator 6 和 Bean Validation 2.0 需要 Java 8 或更高版本。

2.Hibernate Validator

2.1手动对参数进行校验

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotEmpty;
import java.util.Iterator;
import java.util.Set;/*** @Author: wangxia* @Date: 2021/10/20 16:30*/
public class TestPerson {public static void main(String[] args) {ValidatorFactory factory = Validation.buildDefaultValidatorFactory();Validator validator = factory.getValidator();TestPerson testPerson = new TestPerson();testPerson.setAge(-5);Set<ConstraintViolation<TestPerson>> validate = validator.validate(testPerson);Iterator<ConstraintViolation<TestPerson>> iterator = validate.iterator();while (iterator.hasNext()) {ConstraintViolation<TestPerson> e=iterator.next();System.out.println(e.getMessage());}}@NotEmpty(message = "用户名不能为空")private String username;@Min(value = 0,message = "年龄不能小于0岁")@Max(value =150,message = "年龄不能大于150岁")private int age;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}

校验结果:

虽然这样能够手动的获取校验结果但是每次想要校验都添加这段校验的代码还是很麻烦的,由此就衍生出里 @Validated,下面就讲下 @Validated是如何实现校验功能的。

3.@Validated生效原理

@Validated生效之所以能生效主要依赖于Spring的Aop和拦截器,在MethodValidationPostProcessor类中通过Aop和拦截器实现@Validated调用参数校验的目的。Aop的主要目的是每次遇到@Validated注解时都执行拦截器中的方法。

public class MethodValidationPostProcessor extends AbstractBeanFactoryAwareAdvisingPostProcessor implements InitializingBean {private Class<? extends Annotation> validatedAnnotationType = Validated.class;@Nullableprivate Validator validator;public MethodValidationPostProcessor() {}public void setValidatedAnnotationType(Class<? extends Annotation> validatedAnnotationType) {Assert.notNull(validatedAnnotationType, "'validatedAnnotationType' must not be null");this.validatedAnnotationType = validatedAnnotationType;}public void setValidator(Validator validator) {if (validator instanceof LocalValidatorFactoryBean) {this.validator = ((LocalValidatorFactoryBean)validator).getValidator();} else if (validator instanceof SpringValidatorAdapter) {this.validator = (Validator)validator.unwrap(Validator.class);} else {this.validator = validator;}}public void setValidatorFactory(ValidatorFactory validatorFactory) {this.validator = validatorFactory.getValidator();}//InitializingBean接口的方法,在类初始化时调用afterPropertiesSet方法public void afterPropertiesSet() {//针对@Validated注解创建切点Pointcut pointcut = new AnnotationMatchingPointcut(this.validatedAnnotationType, true);//整合切点到切面中,每次遇到@Validated切点就执行this.createMethodValidationAdvice(this.validator)方法this.advisor = new DefaultPointcutAdvisor(pointcut, this.createMethodValidationAdvice(this.validator));}protected Advice createMethodValidationAdvice(@Nullable Validator validator) {//创建拦截器return validator != null ? new MethodValidationInterceptor(validator) : new MethodValidationInterceptor();}
}

拦截器简介

参考文档:hibernate-validator

其实目前这个还不是太完善,会尽快把坑填上的。

java中优雅的参数校验方法_WX5991的博客-CSDN博客

Hibernate Validator简介相关推荐

  1. SpringBoot中使用Hibernate Validator校验工具类

    1.说明 在Spring Boot已经集成Hibernate Validator校验器的情况下, 对于配置了校验注解的请求参数, 框架会自动校验其参数, 但是如果想手动校验一个加了注解的普通对象, 比 ...

  2. SpringMVC集成Hibernate Validator进行注解式的参数校验——让代码更少、更加专注于业务逻辑

    SpringMVC集成Hibernate Validator进行注解式的参数校验 --让代码更少.更加专注于业务逻辑 1 问题背景: 参数验证是一个常见的问题,例如验证用户输入的密码是否为空.邮箱是否 ...

  3. Hibernate Validator源码解析

    一.引言 问题:在代码编写的过程中,数据值的校验在JavaEE三层架构(展示层.业务层.数据访问层)均有涉及,各层的校验需求又是不尽相同的,因此往往会伴随着代码冗余,重复的校验逻辑出现在三层代码中. ...

  4. springboot使用hibernate validator校验

    回到顶部 一.参数校验 在开发中经常需要写一些字段校验的代码,比如字段非空,字段长度限制,邮箱格式验证等等,写这些与业务逻辑关系不大的代码个人感觉有两个麻烦: 验证代码繁琐,重复劳动 方法内代码显得冗 ...

  5. Spring Validation(使用Hibernate Validator)

    1.需要的jar包 hibernate-validator.5.1.3.Final.jar validation-api.1.1.0.Final.jar 2.springsevlet-config.x ...

  6. Hibernate Validator用法

    2019独角兽企业重金招聘Python工程师标准>>> 一.Hibernate ValiDator介绍 Bean Validation是JSR303的定义,Hibernate Val ...

  7. Springmvc的服务端数据验证-----Hibernate Validator

    导入Hibernate validator的Jar包 hibernate-validator-4.3.0.Final.jar jboss-logging-3.1.0.CR2.jar validatio ...

  8. spring boot 1.4默认使用 hibernate validator

    spring boot 1.4默认使用 hibernate validator 5.2.4 Final实现校验功能.hibernate validator 5.2.4 Final是JSR 349 Be ...

  9. Hibernate Validator JSR303示例教程

    Hibernate Validator JSR303示例教程 欢迎使用Hibernate Validator示例教程.数据验证是任何应用程序的组成部分.您将使用Javascript在表示层找到数据验证 ...

最新文章

  1. 爬虫学习笔记(二)——使用 requests 爬取百度图片
  2. 通过一段汇编,加深对寄存器ESP和EBP的理解
  3. 三年级计算机课画曲线,三年级上册信息技术曲线工具教案
  4. JS window对象 Location对象 location用于获取或设置窗体的URL,并且可以用于解析URL。 语法: location.[属性|方法]...
  5. postgresql9.5 run 文件linux安装后配置成开机服务
  6. 电脑上我的文档图标不见了怎么办
  7. 《Python编程从入门到实践》记录之函数编写指南
  8. java使用poi(XSSFWorkbook)读取excel(.xlsx)文件
  9. 中国四季帐篷行业市场供需与战略研究报告
  10. 判断一个二叉树是不是对称二叉树
  11. android多线程中更新ui,Android 在子线程中更新UI
  12. C/C++指针和取地址操作
  13. php 自定义 base64 解码,php base64 编码与解码实例代码
  14. 分享一个MAC下绕开百度网盘限速下载的方法,三步操作永久生效
  15. keyshot渲染玻璃打光_KeyShot渲染,打光这么打,效果倍儿棒!
  16. 【Win10系统右下角网络图标消失、无法联网、网络Internet状态闪退等问题解决方法】
  17. word 文本差异比较
  18. 在线文章生成-自动文章生成
  19. VS2010出现的转换COFF期间失败问题
  20. 性能优化之Apk瘦身

热门文章

  1. matlab多项式拟合体会,多项式拟合——用Matlab实现并分析
  2. WordPress编辑器支持Word文档导入
  3. 关于如何产生随机数的几种方法汇总!(2018.07.08)
  4. 线性空间的一些直观感悟
  5. 数组、指针、结构体的总结_吃鱼的小脸猫_新浪博客
  6. viewpager+fragment 懒加载
  7. 计算机网络总结(4)---网络层
  8. java 调用 libsvm_libsvm java 调用说明
  9. 操作系统笔记05-设备管理
  10. 【苹果相册推】imessage软件安装推信服IP数据报范例也是0x0800