IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> SpringBoot的参数校验器 - Validator -> 正文阅读

[Java知识库]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的形式返回到前端页面。

在这里插入图片描述

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-07-17 16:07:52  更:2022-07-17 16:08:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 15:30:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码