【Spring Boot】整合 Hibernate-Validator
1 使用内置校验器
1.1 引入依赖
新版本的 SpringBoot 需要手动引入,老版本只需引入 spring-boot-starter-web 即可,里面集成了 Hibernate-Validator,这里讲述新版本的
SpringBoot,以 2.4.1 为例
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>1.2 给字段加上相关注解
首先创建一个 Student 实体类
@Data
public class Student implements Serializable {
private String name;
private Integer age;
}然后给字段加上 Hibernate-Validator 校验器内置的注解
@Data
public class Student implements Serializable {
@NotEmpty(message = "姓名不能空")
private String name;
@NotNull(message = "年龄不能为空")
@Range(min = 0, max = 200, message = "年龄不合法")
private Integer age;
}解释:message 代表提示信息
注解作用类型说明 @NotEmpty 字符串被注释的字符串必须非空 @NotNull 字符串被注释的字符串必须不为 null@Range
数值类型、字符串、字节等被注释的元素大小必须在指定的范围内,min 代表最小,max 代表最大
1.3 给方法参数加上 @Validated 注解
首先创建一个控制器类,随便写一个方法,只要参数为 Student 类型的即可,不要忘记加 @RequestBody 注解
@GetMapping("/test")
public Student test3(@Validated @RequestBody Student student) {
System.out.println(student);
return student;
}1.4 捕获 MethodArgumentNotValidException 异常信息
创建一个全局异常处理类,用于捕获抛出的异常,这里主要是通过 Stream 的 API 获取到注解中 message 属性的值
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<String> handle(MethodArgumentNotValidException e) {
List<ObjectError> allErrors = e.getBindingResult().getAllErrors();
ObjectError objectError = allErrors.stream().findFirst().get();
// 获取 message 的值
return new ResponseEntity<>(objectError.getDefaultMessage(), HttpStatus.BAD_REQUEST);
}
}1.5 使用 ApiPos 调试接口
参数合法的结果
控制台输出
Student(name=jesus, age=18)姓名为空的结果

姓名为空串的结果

年龄为 -1 时的结果

2 使用自定义校验器
Hibernate-Validator 校验器的功能可以满足大多数的需求,但如果需要实现一些其他的验证功能,则可以根据规则进行自定义。
2.1 使用自定义注解
如果要自定义验证功能,则需要先自定义注解,以便在实体 Bean 中使用它。 先给 Student 实体类新增一个字段 education 表示学历,定义一个注解
@CustomConstraint
对 education 字段进行校验,规定值必须是专科、本科 、研究生中的一项
@Data
public class Student implements Serializable {
@NotEmpty(message = "姓名不能空")
private String name;
@NotNull(message = "年龄不能为空")
@Range(min = 0, max = 200, message = "年龄不合法")
private Integer age;
@NotNull(message = "学历不能为空")
@CustomConstraint
private String education;
}自定义注解 @CustomConstraint
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = CustomConstraintValidator.class)
public @interface CustomConstraint {
String message() default "学历必须是专科、本科、研究生中的一项";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}2.2 自定义业务校验逻辑类
创建一个类,实现 ConstraintValidator<A,T> 接口,重写两个方法:initialize 和 isValid,分别表示初始化验证消息的方法和执行验证的方法。
public class CustomConstraintValidator implements ConstraintValidator<CustomConstraint, String> {
@Override
public void initialize(CustomConstraint constraintAnnotation) {
System.out.println("自定义验证类启动");
}
@Override
public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
return "专科".equals(s) || "本科".equals(s) || "研究生".equals(s);
}
}ConstraintValidator<A,T> 是一个泛型接口,A 表示之前我们自定义的注解,T 表示被这个注解注释的字段的类型,这里指 String(学历用
String 类型表示)
输入一个合法的值,观察结果

输入一个非法的值,比如硕士,观察结果

3 Validator 校验的常用注解
注解作用类型说明 @NotBlank(message =)
字符串验证字符串非 null,且长度必须大于 0@Email 字符串被注释的元素必须是电子邮箱地址 @Length(min=,max=)
字符串被注释的字符串的大小必须在指定的范围内,min
代表最小,max 代表最大 @NotEmpty 字符串被注释的字符串必须非空 @NotEmptyPattern 字符串在字符串不为空的情况下,是否匹配正则表达式
@DateValidator 字符串验证日期格式是否满足正则表达式,Local 为英语 @DateFormatCheckPattern 字符串验证日期格式是否满足正则表达式,Local
是自己手动指定的 @Range(min=,max=,message=)
字符串、数值类型、字节等被注释的元素必须在合适的范围内 @NotNull 任意被注释的元素必须为 null@AssertTrue 布尔值被注释的元素必须为
true@AssertFalse 布尔值被注释的元素必须为 false@Min(value) 数字被注释的元素必须是一个数字,且大于或等于指定的最小值 @Max(
value)
数字被注释的元素必须是一个数字,且小于或等于指定的最大值 @DecimalMin(value)
数字被注释的元素必须是一个数字,且大于或等于指定的最小值 @DecimalMax(value)
数字被注释的元素必须是一个数字,且小于或等于指定的最大值 @Size(max=, min=)
数字被注释的元素必须是一个数字,min 代表最小,max 代表最大 @Digits (integer, fraction)
数字被注释的元素必须是一个数字,且在可接收的范围内 @Past 日期被注释的元素必须是一个过去的日期