1、不吹不擂,第一篇就能提升你对Bean Validation数据校验的认知
validation-api提供了bean校验的规范,hibernate-validator提供了它的实现,在不依赖web环境的情况下,需要导入EL的api的依赖(web环境下,已经提供了该el-api的实现)。并且从2.0.1开始,javax.validation正式改名为jakarta.validation。
简单示例
导入依赖
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.4.3.Final</version>
</dependency>
<!-- 规范API -->
<dependency>
<groupId>javax.el</groupId>
<artifactId>javax.el-api</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.el</artifactId>
<version>3.0.0</version>
</dependency>
@ToString
@Setter
@Getter
public class Person {
@NotNull
public String name;
@NotNull
@Min(0)
public Integer age;
}
import com.zzhua.entity.Person;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import java.util.Set;
public class Test01 {
public static void main(String[] args) {
Person person = new Person();
person.setAge(-1);
// 1、使用【默认配置】得到一个校验工厂 这个配置可以来自于provider、SPI提供
ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
// 2、得到一个校验器(Validator等校验器是线程安全的,因此一般来说一个应用全局仅需一份即可,因此只需要初始化一次)
Validator validator = validatorFactory.getValidator();
// 3、校验Java Bean(解析注解) 返回校验结果
Set<ConstraintViolation<Person>> result = validator.validate(person);
// 输出校验结果
result.stream().map(v -> v.getPropertyPath() + " " + v.getMessage() + ": " + v.getInvalidValue()).forEach(System.out::println);
}
/* 输出:
age 最小不能小于0: -1
name 不能为null: null
*/
}
2、站在使用层面,Bean Validation这些标准接口你需要烂熟于胸\
抽取公用的方法如下
public abstract class ValidatorUtil {
public static ValidatorFactory obtainValidatorFactory() {
return Validation.buildDefaultValidatorFactory();
}
public static Validator obtainValidator() {
return obtainValidatorFactory().getValidator();
}
public static ExecutableValidator obtainExecutableValidator() {
return obtainValidator().forExecutables();
}
public static <T> void printViolations(Set<ConstraintViolation<T>> violations) {
violations.stream().map(v -> v.getPropertyPath() + " " + v.getMessage() + ": " + v.getInvalidValue()).forEach(System.out::println);
}
}
validate:校验Java Bean
验证Java Bean对象上的所有约束
<T> Set<ConstraintViolation<T>> validate(T object, Class<?>... groups);
@ScriptAssert(script = "_this.name==_this.fullName", lang = "javascript")
@Data
public class User {
@NotNull
private String name;
@Length(min = 20)
@NotNull
private String fullName;
}
@Test
public void test5() {
User user = new User();
user.setName("YourBatman");
Set<ConstraintViolation<User>> result = ValidatorUtil.obtainValidator().validate(user);
ValidatorUtil.printViolations(result);
}
validateProperty:校验指定属性
校验某个Java Bean中的某个属性上的所有约束。
<T> Set<ConstraintViolation<T>> validateProperty(T object, String propertyName, Class<?>... groups);
@Test
public void test6() {
User user = new User();
user.setFullName("YourBatman");
Set<ConstraintViolation<User>> result = ValidatorUtil.obtainValidator().validateProperty(user, "fullName");
ValidatorUtil.printViolations(result);
}
validateValue:校验value值
验某个value值,是否符合指定属性上的所有约束。可理解为:若我把这个value值赋值给这个属性,是否合法?
<T> Set<ConstraintViolation<T>> validateValue(Class<T> beanType,
String propertyName,
Object value,
Class<?>... groups);
@Test
public void test7() {
Set<ConstraintViolation<User>> result = ValidatorUtil.obtainValidator().validateValue(User.class, "fullName", "A哥");
ValidatorUtil.printViolations(result);
}
获取Validator实例
方式一:工厂直接获取
@Test
public void test3() {
Validator validator = ValidatorUtil.obtainValidatorFactory().getValidator();
}
方式二:从上下文获取
@Test
public void test3() {
Validator validator = ValidatorUtil.obtainValidatorFactory().usingContext()
.parameterNameProvider(new DefaultParameterNameProvider())
.clockProvider(DefaultClockProvider.INSTANCE)
.getValidator();
}
3、Jakarta Bean Validation官方文档(英文)
Jakarta Bean Validation官方文档(英文) or https://beanvalidation.org/
4、springmvc参数校验原理
https://blog.csdn.net/shenchaohao12321/article/details/100163991