关于Spring Validation数据校检的使用流程分析

 更新时间:2024年11月08日 09:58:50   投稿:mrr  
在实际项目中,对客户端传递到服务端的参数进行校验至关重要,SpringValidation提供了一种便捷的方式来实现这一需求,通过在POJO类的属性上添加检查注解,本文给大家介绍Spring Validation数据校检的使用流程,感兴趣的朋友一起看看吧

Spring Validation

1 关于Spring Validation

在实际项目我们需要对客户端传递到服务端的参数进行校验,用于判定请求参数的合法性,假如请求参数不合法则不可以再去执行后续的业务了。那如何校验呢?

一种方式是我们在控制层方法中每次都自己进行参数有效值的判断,不合法可以抛出异常,但是工作量和代码复杂度会比较高;

第二种方式就是采用市场上主流的 Spring Validation 框架去实现校验,所以 Spring Validation 框架的主要作用是 检查参数的基本有效性。

2 使用流程

在Spring Boot工程中,使用此框架需要添加依赖,并刷新maven

<!-- Spring Boot支持Spring Validation的依赖项,用于检查参数的基本有效性 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

3 快速入门

1.在处理请求的方法的参数列表中,在POJO类型的参数上添加@Validated注解,表示需要通过Spring Validation框架检查此参数,例如UserController中注册功能:

@ApiOperation(value = "注册功能")
@PostMapping("reg")
public JsonResult reg(@RequestBody @Validated UserRegDTO userRegDTO){}

2.在此POJO类中的属性上,添加对应的检查注解,以配置检查规则,

例如,添加@NotNull注解,就表示“不允许为null”的规则!

UserRegDTO

@Data
public class UserRegDTO {
    @NotNull
    @ApiModelProperty(value = "用户名", required = true, example = "赵丽颖")
    private String username;
    @ApiModelProperty(value = "密码", required = true, example = "123456")
    private String password;
    @ApiModelProperty(value = "昵称", required = true, example = "萤火虫")
    private String nickname;
}

重启工程,在Knife4j中测试,当提交请求时,如果username参数为 null,服务器端将响应400错误。

同时在终端也会出现异常

4 运行异常处理

4.1 说明

在使用Spring Validation框架执行参数的检查时,如果检查不通过,除了响应400错误以外,在控制台还会抛出错误:MethodArgumentNotValidException 使用全局异常处理器解决。

[org.springframework.web.bind.MethodArgumentNotValidException: Validation failed for argument [0] in public cn.tedu._043mvcweibo.common.response.JsonResult cn.tedu._043mvcweibo.controller.UserController.reg(cn.tedu._043mvcweibo.pojo.dto.UserRegDTO): [Field error in object 'userRegDTO' on field 'username': rejected value [null]; codes [NotNull.userRegDTO.username,NotNull.username,NotNull.java.lang.String,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [userRegDTO.username,username]; arguments []; default message [username]]; default message [不能为null]] ]

4.2 处理异常

使用全局异常处理器来处理 MethodArgumentNotValidException 异常

第1步:全局异常处理器 GlobalExceptionHandler 中定义处理异常方法

@ExceptionHandler
public JsonResult doHandleMethodArgumentNotValidException(MethodArgumentNotValidException ex){
    return new JsonResult(3002, "请求参数错误");
}

第2步:重启工程,在Knife4j中测试

4.3 明确提示消息

当提交的username的值为 null 时,可以发现异常已被处理!

但是,处理结果并不合适,因为,客户端得到此结果后,仍无法明确出现了什么错误!

所有的检查注解都可以配置message参数,用于对错误进行描述。

第1步:@NotNull 注解中添加 message 参数

@NotNull(message = "必须提交用户名")
private String username;

第2步:自定义枚举状态码 StatusCode

VALIDATE_ERROR(3002, "参数校验失败")

第3步:异常方法中获取提示信息 message

在处理异常时,需要调用MethodArgumentNotValidException对象的getFieldError().getDefaultMessage()获取以上配置的描述文本

@ExceptionHandler
public JsonResult handleBindException(MethodArgumentNotValidException ex){
    /*
    	ex.getFieldError().getDefaultMessage():获取 @NotNull(message="xxx") 中message的消息
    */
    String message = ex.getFieldError().getDefaultMessage();
    return new JsonResult(StatusCode.VALIDATE_ERROR, message);
}

第4步:重启工程,在Knife4j中测试

5 常用注解

5.1 @NotNull注解

  • 作用:用于验证对象是否为 null
  • 用法:@NotNull 注解用于对象类型上
  • 示例
@NotNull(message = "用户名不能为null")
private String username;

5.2 @NotEmpty 注解

  • 作用:用于验证字符串是否为空,并且会检查是否为 null 值(为null值时报错)
  • 用法:用于字符串类型上
  • 示例
@NotEmpty(message = "用户名不能为空")
private String username;

5.3 @NotBlank 注解

  • 作用:不允许为空白,即不允许是“仅由空格、TAB等空白值组成的字符串”,也不允许为空字符串,也不允许为空值null
  • 用法:用于字符串类型上
  • 示例
@NotBlank(message = "用户名不能为空白串")
private String username;

5.4 @Size 注解

  • 作用:可以指定最小值和最大值限制字符串的长度
  • 用法:用于字符串类型参数
  • 示例
@Size(min = 6, max = 20, message = "用户名长度必须在6到20之间")
private String username;

5.5 @Range 注解

  • 作用:用于验证数字类型字段的取值范围,通过配置min和max属性来限制数值类型参数的值区间包括最小值和最大值
  • 用法:用于数值类型参数
  • 示例
@Range(min = 1, max = 10, message = "年龄必须在1-10岁之间")
private int age;
@Range(min = 0.1, max = 1.0, message = "成绩必须在0.1到1.0之间")
private double score;

6 非POJO参数校验

在 Spring Validation 中,除了对 POJO(Plain Old Java Object)进行校验的功能外,还支持对非 POJO 进行校验,比如 String、Integer、Double 等类型的参数。

6.1 使用流程

在当前方法所在的类上添加 @Validated 注解在参数上添加对应的检查注解

6.2 使用示例

对于 id 参数进行范围校验,范围只能在1-10之间

第1步:在类 WeiboController 中添加 @Validated 注解

@Validated
public class WeiboController {}

第2步:在控制器方法参数 id 上添加对应的检查注解

public JsonResult selectById(@Range(min = 1, max=10, message = "请提交合法的ID值!") @RequestParam int id, String username)

第3步:重启工程,在Knife4j或者浏览器中测试

到此这篇关于Spring Validation数据校检的文章就介绍到这了,更多相关Spring Validation数据校检内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 冒泡排序的原理及java代码实现

    冒泡排序的原理及java代码实现

    冒泡排序法:关键字较小的记录好比气泡逐趟上浮,关键字较大的记录好比石块下沉,每趟有一块最大的石块沉底。算法本质:(最大值是关键点,肯定放到最后了,如此循环)每次都从第一位向后滚动比较,使最大值沉底,最小值上升一次,最后一位向前推进
    2016-02-02
  • SpringBoot整合Kafka实现高可用消息队列集群详解

    SpringBoot整合Kafka实现高可用消息队列集群详解

    Apache Kafka是一个分布式流处理平台,这篇文章主要介绍了SpringBoot如何整合Kafka实现高可用消息队列集群,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下
    2026-01-01
  • Java 代码检查工具之PMD入门使用详细教程

    Java 代码检查工具之PMD入门使用详细教程

    这篇文章主要介绍了Java 代码检查工具之PMD入门使用详细教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • Java Collection集合的三种遍历方式详解

    Java Collection集合的三种遍历方式详解

    Collection集合遍历的方式有三种,迭代器foreach/增强for循环lambda表达式,这篇文章主要介绍了Java Collection集合的三种遍历方式,需要的朋友可以参考下
    2022-11-11
  • springboot执行延时任务之DelayQueue实例

    springboot执行延时任务之DelayQueue实例

    这篇文章主要介绍了springboot执行延时任务之DelayQueue实例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • Java8 lambda表达式的10个实例讲解

    Java8 lambda表达式的10个实例讲解

    这篇文章主要介绍了Java8 lambda表达式的10个实例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Ubuntu搭建Java开发环境笔记

    Ubuntu搭建Java开发环境笔记

    这篇文章主要介绍了Ubuntu搭建Java开发环境笔记,本文讲解了JDK安装、MyEclipse安装及第一个Hello world程序等内容,需要的朋友可以参考下
    2015-03-03
  • IDEA新建springboot项目时未生成pom.xml文件的解决操作

    IDEA新建springboot项目时未生成pom.xml文件的解决操作

    这篇文章主要给大家介绍了关于IDEA新建springboot项目时未生成pom.xml文件的解决操作方法,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2023-02-02
  • maven的pom文件与打包详解

    maven的pom文件与打包详解

    pom文件定于了一个maven项目的maven配置,一般pom文件的放在项目或者模块的根目录下。本文详细的介绍了pom文件配置,感兴趣的可以了解一下
    2021-08-08
  • SpringBoot Maven打包失败报:class lombok.javac.apt.LombokProcessor错误的解决办法

    SpringBoot Maven打包失败报:class lombok.javac.apt.Lombo

    最新项目部署的时候,出现了一个maven打包失败的问题,报:class lombok.javac.apt.LombokProcessor错误,所以本文给大家介绍了如何解决SpringBoot Maven 打包失败:class lombok.javac.apt.LombokProcessor 错误,需要的朋友可以参考下
    2023-12-12

最新评论