SpringBoot的参数校验器 - Validator

1、前提

在日常的开发中,服务端对象的校验是非常重要的一个环节,比如注册的时候:校验用户名,密码,身份证,邮箱等信息是否为空,以及格式是否正确。
但是这种在日常的开发中进行校验太繁琐了,代码繁琐而且很多。Validator框架应运而生,它的出现就是为了减少开发人员在开发时对数据校验的代码,提升开发效率。

Spring的validator校验框架遵守的是JSR-303的验证规范(参数校验规范),JSR全称:Java Specification Requests缩写。

2、导入依赖

  <dependency>
   	  <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-validation</artifactId>
  </dependency>

3、常见的验证注解

JSR提供的校验注解:

注解名称 说明
@Null(message) 被注释的元素必须为 null
@NotNull(message) 被注释的元素必须不为 null
@AssertTrue(message) 被注释的元素必须为 true
@AssertFalse(message) 被注释的元素必须为 false
@Min(value,message) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value,message) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value,message) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value,message) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max, min,message) 被注释的元素的大小必须在指定的范围内
@Digits (integer, fraction,message) 被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past(message) 被注释的元素必须是一个过去的日期
@Future(message) 被注释的元素必须是一个将来的日期
@Pattern(regex,flag,message) 被注释的元素必须符合指定的正则表达式

Hibernate Validator提供的校验注解:

注解名称 说明
@NotBlank(message ) 验证字符串非null,且trim后长度必须大于0
@Email(regexp,message) 被注释的元素必须是电子邮箱地址
@Length(min,max,message) 被注释的字符串的大小必须在指定的范围内
@NotEmpty(message) 被注释的字符串的必须非空
@Range(min,max,message) 被注释的元素必须在合适的范围内

4、@Validated的使用

1使用在Controller类上:当一些约束是直接出现在Controller层中的参数前时,只有将@Validated放在类上时,参数前的约束才会生效。


@RestController
@Validated 
// 因为在Controller中出现了直接的约束,所以需要在类上加入@Validated注解
public class MessageController {
    
    

    @GetMapping(value = "/validate")
    // 判断用户传入的字符串参数的长度是否大于6且小于十
   public String validateTest(@Length(max = 10,min = 6,message = "长度错误") @RequestParam String name){
    
    
        System.out.println(name);
        return "成功";
   }

}

2、使用在方法形参上: 当Controller层中参数是一个对象模型时,只有将@Validated直接放在该模型前,该模型内部的字段才会被校验(如果有对该模型的字段进行约束的话)。

// 定义Java对象,且在属性上添加约束
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {
    
    

    @NotNull
    private String userName;

    @NotNull
    private int age;

    @NotNull
    @Length(min = 6,max = 10,message="长度不能小于六位且不能大于十位")
    private String password;

}
// 调用,且在实体类前面加入@Validated注解
@RestController
public class MessageController {
    
    

   @GetMapping(value = "/validate")
   // 因为形参是带着验证的实体类,所以需要在形参前面加入@Validated注解
   public String validateTest(@Validated @RequestBody User user){
    
    
        System.out.println(user.toString());
        return "成功";
   }
}

5、使用

@RestController
@Validated 
// 因为在Controller中出现了直接的约束,所以需要在类上加入@Validated注解
public class MessageController {
    
    

    @GetMapping(value = "/validate")
    // 判断用户传入的字符串参数的长度是否大于6且小于十
   public String validateTest(@Length(max = 10,min = 6,message = "长度错误") @RequestParam String name){
    
    
        System.out.println(name);
        return "成功";
   }
}

发起请求后的前端页面:
因为我给出的参数name的长度大于了10,所以触发了验证器,并且以错误的形式进行提示。
在这里插入图片描述

发起请求后的后端(IDEA控制台)
因为验证器触发,后台也以报错的形式提示。
在这里插入图片描述

6、自定义验证器异常处理器

因为触发了验证器,如果不符合验证器的规范就会报错,而使用默认的验证处理器的话,则是直接提示错误,这种方式对于普通的使用者来说就不是很友好。
所以,开发人员就需要自己定义验证器异常处理器。

异常处理器常见的三大异常

  1. ConstraintViolationException:不符合验证规则时触发
  2. BindException:使用form data方式调用接口,校验异常抛出 BindException
  3. MethodArgumentNotValidException:使用 json 请求体调用接口,校验异常会抛出此错误

相对于其他的错误,可以从控制台报错的情况中对该错误进行处理,同时也可以使用Exception对其他不想处理的错误进行处理。

当在异常处理器中同时使用了Exception和ConstraintViolationException时,如果验证器触发了ConstraintViolationException,就只会执行ConstraintViolationException所在的处理方法,而不会调用Exception处理方法,所以异常处理器会优先处理已经有所指明的异常,只有在异常处理器中没有对该异常进行声明的情况下才会执行Exception所在的异常处理方法。

异常处理类的两大注解

  1. @RestControllerAdvice:声明此类为异常处理类
  2. @ExceptionHandler:声明此方法处理什么异常

话不多说,上代码:

@RestControllerAdvice
// 声明此类为异常处理类
public class ValidateExceptionHandler {
    
    

 	// 声明此方法处理ConstraintViolationException所产生的异常
    @ExceptionHandler(ConstraintViolationException.class)
    public String exceptionHandler(ConstraintViolationException e){
    
    
        System.out.println("拦截被触发" );
        return "参数错误了";
    }

    @ExceptionHandler(Exception.class)
    public String exceptionHandler(Exception e){
    
    
        return "abc";
    }
}

当发生了ConstraintViolationException异常时就会触发第一个方法,并且页面上会显示 ”参数错误了" ,所以@RestControllerAdvice会将方法的返回值以JSON的形式返回到前端页面。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_45515182/article/details/125766858