SpringBoot整合Hibernate-Validator校验器
Posted pcdd
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot整合Hibernate-Validator校验器相关的知识,希望对你有一定的参考价值。
SpringBoot整合Hibernate-Validator校验器
- 使用内置校验器
1.1 引入依赖
1.2 给字段加上相关注解
1.3 给方法参数加上@Validated注解
1.4 捕获MethodArgumentNotValidException异常信息
1.5 使用ApiPos调试接口 - 使用自定义校验器
2.1 自定义注解类
2.2 自定义校验业务逻辑类 - 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=pcdd, age=21)
姓名为空的结果
姓名为空串的结果
年龄为-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 |
字符串 | 被注释的元素必须是电子邮箱地址 | |
@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 | 日期 | 被注释的元素必须是一个过去的日期 |
以上是关于SpringBoot整合Hibernate-Validator校验器的主要内容,如果未能解决你的问题,请参考以下文章
[SpringBoot系列]SpringBoot如何整合SSMP
SpringBoot完成SSM整合之SpringBoot整合junit