SpringBoot整合Hibernate-Validator校验器

Posted pcdd

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot整合Hibernate-Validator校验器相关的知识,希望对你有一定的参考价值。

SpringBoot整合Hibernate-Validator校验器

  1. 使用内置校验器
    1.1 引入依赖
    1.2 给字段加上相关注解
    1.3 给方法参数加上@Validated注解
    1.4 捕获MethodArgumentNotValidException异常信息
    1.5 使用ApiPos调试接口
  2. 使用自定义校验器
    2.1 自定义注解类
    2.2 自定义校验业务逻辑类
  3. 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
@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日期被注释的元素必须是一个过去的日期

以上是关于SpringBoot整合Hibernate-Validator校验器的主要内容,如果未能解决你的问题,请参考以下文章

[SpringBoot系列]SpringBoot如何整合SSMP

springboot怎么整合activiti

SpringBoot完成SSM整合之SpringBoot整合junit

springboot整合jedis

SpringBoot 整合其他框架 -- SpringBoot整合Mybatis

SpringBoot 整合其他框架 -- SpringBoot整合Junit