Spring Validation数据校检

文章目录

  • Spring Validation
    • 1 关于Spring Validation
    • 2 使用流程
    • 3 快速入门
    • 4 运行异常处理
      • 4.1 说明
      • 4.2 处理异常
      • 4.3 明确提示消息
    • 5 常用注解
      • 5.1 `@NotNull`注解
      • 5.2 `@NotEmpty` 注解
      • 5.3 `@NotBlank` 注解
      • 5.4 `@Size` 注解
      • 5.5 `@Range` 注解
    • 6 非POJO参数校验
      • 6.1 使用流程
      • 6.2 使用示例

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;
    }
    
  3. 重启工程,在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或者浏览器中测试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/909523.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024数据库国测揭晓:安全与可靠的新标准,你了解多少?

2024年数据库国测的结果&#xff0c;于9月份的最后一天发布了。 对于数据库行业的从业者来说&#xff0c;国测是我们绕不过去的坎儿。那么什么是国测&#xff1f;为什么要通过国测&#xff0c;以及国测的要求有哪些&#xff1f; 这篇文章带大家一探究竟。 国测 自愿平等、客…

前端入门一之CSS知识详解

前言 CSS是前端三件套之一&#xff0c;在MarkDown中也完美兼容这些语法&#xff1b;这篇文章是本人大一学习前端的笔记&#xff1b;欢迎点赞 收藏 关注&#xff0c;本人将会持续更新。 文章目录 Emmet语法&#xff1a;CSS基本语法&#xff1a;css语法结构只有3种&#xff1a…

虚拟现实和增强现实技术,如何打造沉浸式体验?

内容概要 在这个科技飞速发展的时代&#xff0c;虚拟现实&#xff08;VR&#xff09;与增强现实&#xff08;AR&#xff09;技术的结合就像调皮的小精灵&#xff0c;一下子把我们的生活变得神奇又有趣。想象一下&#xff0c;你正在游戏中与精灵搏斗&#xff0c;突然间身边的客…

EL面包屑导航实现

前言 el-breadcrumb 是 Element Plus 中的面包屑导航组件&#xff0c;主要用于展示当前页面在整个应用程序中的位置&#xff0c;并提供导航功能 https://element-plus.org/zh-CN/component/breadcrumb 基础用法 在 el-breadcrumb 中使用 el-breadcrumb-item 标签表示从首页开…

Qt 练习做一个登录界面

练习做一个登录界面 效果 UI图 UI代码 <?xml version"1.0" encoding"UTF-8"?> <ui version"4.0"><class>Dialog</class><widget class"QDialog" name"Dialog"><property name"ge…

c语言简单编程练习10

1、typedef和#define的区别 在用作数据类型替换时的区别&#xff1a; #include <stdio.h> #include <unistd.h>typedef char * A; //typedef需要&#xff1b; #define B char *int main(int argc, char *argv[]) {A a,b;B c,d;printf("a_size%ld\n"…

【spark的集群模式搭建】Standalone集群模式的搭建(简单明了的安装教程)

文章目录 1、使用Anaconda部署Python2、上传、解压、重命名3、创建软连接4、配置spark环境变量5、修改 spark-env.sh配置文件6、启动hdfs&#xff0c;创建文件夹7、修改spark-defaults.conf配置文件8、修改workers配置文件9、修改log4j.properties配置文件&#xff08;可选&…

ST-GCN模型实现花样滑冰动作分类

项目源码获取方式见文章末尾&#xff01; 600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【基于CNN-RNN的影像报告生成】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实现…

【RabbitMQ】03-交换机

1. 交换机 2. Fanout交换机 广播。生产者向exchange发消息 SpringBootTest public class SpringAmqpTest {Autowiredpublic RabbitTemplate rabbitTemplate;Testvoid testSimple() {String exchangName "hmall.fabout";rabbitTemplate.convertAndSend(exchangName…

【07】Maven项目多环境打包配置

&#xff08;1&#xff09;Web项目使用Maven进行多模块划分开发之后&#xff0c;面临一个问题&#xff0c;即如何加载不同环境的配置文件打包发布到不同的环境中&#xff1f; &#xff08;2&#xff09;不同的环境有开发环境、测试环境、线上生产环境等。 &#xff08;3&#x…

【Unity Shader】Special Effects(十)Change 变换(UI)

源码:[点我获取源码] 索引 Change 变换思路分析变换进度噪声纹理闪烁闪烁时机闪烁颜色闪烁动画Change 变换 变换的效果为图像间的切换带来动感过程,使用动画播放器: 思路分析 首先,从原始图像变换到目标图像是一个从0到1的过程,这个过程我们命名为变换进度(0为完全显…

关于wordpress instagram feed 插件 (现更名为Smash Balloon Social Photo Feed)

插件地址&#xff1a; Smash Balloon Social Photo Feed – Easy Social Feeds Plugin – WordPress 插件 | WordPress.org China 简体中文 安装后&#xff0c;配置教程&#xff1a; Setting up the Instagram Feed Pro WordPress Plugin - Smash Balloon 从这里面开始看就…

JavaScript的对象事件处理程序

一、对象的事件 对象的事件是指在一个对象上发生的特定动作或状态改变。对象可以是现实世界中的物体、概念、数据结构等。根据对象的类型和功能&#xff0c;可能会有不同类型的事件。 对象的事件一般由对象的方法或属性来处理和触发。通过定义对象的方法和属性&#xff0c;可…

Win11 CLion Qt开发探索

文章目录 一、Win11 CLion Qt需要的环境二、环境说明三、Win11 CLion Qt 开发步骤四、CLion Qt CMake脚本相关配置4.1 在CLion里如何使用资源文件.qrc4.2 Qt6 cmake如何添加ts翻译文件 五、程序打包 本篇博客介绍在Win11上使用CLion来编写Qt QWidget项目。 视频讲解&#xff1a…

Windows Server2012 R2搭建NFS服务器

正文共&#xff1a;1024 字 23 图&#xff0c;预估阅读时间&#xff1a;1 分钟 在测试vCenter的集群操作时&#xff0c;出现了共享vSAN错误的问题&#xff0c;导致无法继续。我也只好先创建一个共享NFS&#xff08;Network File System&#xff0c;网络文件系统&#xff09;存储…

信息安全工程师(77)常见网络安全应急事件场景与处理流程

前言 网络安全应急事件场景多样&#xff0c;处理流程也需根据具体情况灵活调整。以下将详述几种常见的网络安全应急事件场景及其处理流程。 一、数据泄露事件 场景描述&#xff1a; 数据泄露是指敏感、受保护或机密数据被未经授权的个人复制、传输、查看、窃取或使用。这种事件…

win10下MMSegmentation自定义数据集

下载1.2.1版本: Releases open-mmlab/mmsegmentation GitHub 安装环境 本地torch环境为1.9.1 pip install -U openmim mim install mmengine mim install "mmcv>=2.0.0" 报mmcv版本不匹配的问题,形如:MMCV==X.X.X is used but incompatible. Please inst…

低代码解锁跨平台应用开发新境界

数字化转型中&#xff0c;企业面临应用开发挑战&#xff0c;低代码平台成为理想选择。ZohoCreator提供统一开发环境、拖拽设计、预置模板等&#xff0c;支持高效构建跨平台应用&#xff0c;确保数据安全与合规&#xff0c;助力企业数字化转型。 一、低代码平台是什么&#xff1…

yolov8涨点系列之C2f模块改进主分支

文章目录 C2F 模块介绍定义与基本原理应用场景 C2f模块修改步骤(1) C2f_up模块编辑(2)在__init_.pyblock.py中声明&#xff08;3&#xff09;在task.py中声明yolov8引入C2f_up模块yolov8.yamlyolov8.yaml引入C2f_up模块 C2f改进对YOLOv8检测具有多方面的好处 C2F 模块介绍 定义…

数据结构算法篇--递归(c语言版)

目录 1.递归 1.1求阶乘&#xff1a; 1.2.斐波那契数 1.3. 求幂 1.递归 在C语言中&#xff0c;递归是一种函数调用自身的方法&#xff0c;用来解决一些具有重复性质的问题。例如&#xff0c;计算阶乘、斐波那契数列等问题都可以通过递归实现。 递归在书写的时候&#xff0…