hibernate-validator校验框架
一、传统的参数校验
public class TraditionalTest {
@Test
public void test01(){
UserInfo userInfo = new UserInfo();
validateUserInfo(userInfo);
}
private static void validateUserInfo(UserInfo userInfo){
// 用户名校验
String name = userInfo.getName();
if (name == null || "".equals(name) || "".equals(name.trim())) {
//不符合校验规则
throw new RuntimeException("name 不符合校验规则");
}
// age校验
Integer age = userInfo.getAge();
boolean ageValidate = age > 1 && age < 200;
if (!ageValidate) {
throw new RuntimeException("age不符合校验规则,应在(1-200)");
}
//......
}
}
二、非web环境下使用hibernate-validator
2.1 搭建环境
org.hibernate.validator
hibernate-validator
7.0.1.Final
org.apache.tomcat.embed
tomcat-embed-el
10.0.22
2.2 validator初体验
-
编写 ValidationUtil 工具类
package com.zs.validation; import jakarta.validation.ConstraintViolation; import jakarta.validation.Validation; import jakarta.validation.Validator; import java.util.List; import java.util.Set; import java.util.stream.Collectors; public class ValidationUtil { private static Validator validator; static { validator = Validation.buildDefaultValidatorFactory().getValidator(); } public static List valid(Object obj) { //如果被校验对象 没有校验通过,则set里面就有校验信息 Set set = validator.validate(obj); List list = set.stream().map(v -> "属性:" + v.getPropertyPath() + ",属性的值" + v.getInvalidValue() + ",校验不通过的提示信息:" + v.getMessage()) .collect(Collectors.toList()); return list; } }
-
给需要校验的类添加注解
import jakarta.validation.constraints.NotNull; @Data public class UserInfo { /** * 不能是null, "", " " */ @NotNull private String name;
-
测试验证
public class Demo { public static void main(String[] args) { UserInfo userInfo =new UserInfo() ; List list = ValidationUtil.valid(userInfo); System.out.println(list); } }
2.3 validator加载原理
2.3.1 javaEE规范
- javaEE规范是很多不相关的java package组成的javaee规范
- 常见的javaEE规范
- javax.sql ---- mysql ,sqlserver,oracle …
- javax.jms ---- activemq
- javax.servlet ---- tomcat,jetty …
- javax.persistence ---- hibernate
- javax.transaction----分布式事务
- java.validation ----- hibernate-validator
jdk自带了一些常用的javaee规范,对于没有自带的如果想要使用就需要自己引用了,比如beanvalidation
2.3.2 SPI机制
- spi全称为 (Service Provider Interface),是JDK内置的一种服务提供发现机制。SPI是一种动态替换发现的 机制,一种解耦非常优秀的思想。
- spi的工作原理: 就是ClassPath路径下的META-INF/services文件夹中, 以接口的全限定名来命名文件名,文件里面写该接口的实现。然后再资源加载的方式,读取文件的内容(接口实现的全限定名), 然后再去加载类。
- spi可以很灵活的让接口和实现分离, 让api提供者只提供接口, 第三方来实现。
2.3.3 源码解析
2.4 常用的校验约束注解
@Null //被注释的元素必须为null
@NotNull //被注释的元素必须不为null
@NotEmpty //被注释的集合(size > 0)/字符串(!=null && !"")
@NotBlank //!=null && !"" && !" "
@AssertTrue //被注释的元素必须为true
@AssertFalse //被注释的元素必须为false
@Min(value) //被注释的元素必须是一个数字,>=
@Max(value) //被注释的元素必须是一个数字,=
@DecimalMax(value)