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或者浏览器中测试

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

‌STAR法则

一&#xff1a;STAR法则 STAR法则是一种简单而实用的表现技巧&#xff0c;常被用于求职过程中的个人经历描述&#xff0c;富有条理性&#xff0c;可以帮助你在职场中脱颖而出。“STAR”分别对应的是situation-task-action-result&#xff0c;通过情境、目标、行动和结果四个方面…

uniapp—android原生插件开发(1环境准备)

本篇文章从实战角度出发&#xff0c;将UniApp集成新大陆PDA设备RFID的全过程分为四部曲&#xff0c;涵盖环境搭建、插件开发、AAR打包、项目引入和功能调试。通过这份教程&#xff0c;轻松应对安卓原生插件开发与打包需求&#xff01; 项目背景&#xff1a; UniApp集成新大陆P…

国标GB28181设备管理软件EasyGBS国标GB28181视频平台:GB/T28181中的流类型

在当今的视频监控领域&#xff0c;GB/T28181协议作为中国国家标准委员会发布的重要技术规范&#xff0c;发挥着举足轻重的作用。这一标准不仅为视频监控系统的设备接入、视频流传输、设备控制等功能提供了明确的技术指导&#xff0c;还极大地促进了不同厂家设备之间的兼容性和互…

使用pip安装项目时,遇到以下错误的解决方案:error: [Errno 13] Permission denied

我是在虚拟环境下出现了这个错误 出现这种情况大概率是conda环境没有下载用户路径下的python解释器&#xff0c;你可以使用下面命令来检查 which python3这里如果出现的路径不是你用户目录下的&#xff0c;就是这个原因&#xff0c;你的conda环境在用户目录下&#xff0c;但是…

无人车之定位技术篇

无人车的定位技术是指确定无人车在世界坐标系&#xff08;一般指二维环境&#xff09;中的位置及其本身的姿态的技术。随着技术的不断发展&#xff0c;无人车的定位技术已经实现了多种方法的融合与创新。 一、主要定位技术 GPS定位 原理&#xff1a;基于全球定位系统&#x…

微观经济学速成笔记

需求的收入弹性 需求的收入弹性表示在一定的时期内消费者对某种商品的需求量的变动对于消费者收入量变动的反应程度,供给的收入弹性公式为: 永非证可eM或w-此公-可 根据商品的需求和收入弹性公式&#xff0c;可以将商品分类: em < 0的商品为劣等品(也称低档品)&#xff0c;因…

泷羽sec学习打卡-Windows基础命令2总结篇

声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 关于windows的那些事儿-Base2 一、Windows-Base2常见的协议和端口常用的cmd命令渗透写入文件的思路&…

面经—科大讯飞

1extern c 修饰才能使用c在c中 new delete 可以自动判断分配多少空间 形成多态的两个条件&#xff0c;1.继承关系

软考教材重点内容 信息安全工程师 第1章 网络信息安全概述

第 1 章 网络信息安全概述 1.1.1 网络信息安全相关概念 狭义上的网络信息安全特指网络信息系统的各组成要素符合安全属性的要求&#xff0c;即机密性、完整性、可用性、抗抵赖性、可控性。 广义上的网络信息安全是涉及国家安全、城市安全、经济安全、社会安全、生产安全、人身安…

【51单片机】I2C总线详解 + AT24C02

学习使用的开发板&#xff1a;STC89C52RC/LE52RC 编程软件&#xff1a;Keil5 烧录软件&#xff1a;stc-isp 开发板实图&#xff1a; 文章目录 AT24C02介绍存储器 I2C总线介绍I2C时序结构数据帧AT24C02数据帧 编程实例 —— 按键控制数据大小&存储器写入读出 AT24C02介绍 …

全球海工供应链,中国建造!第十一届全球FPSOFLNGFSRU大会在上海隆重召开

10月30日-31日&#xff0c;全球海洋工程与高端装备领域的年度国际交流盛会——第十一届全球FPSO&FLNG&FSRU大会暨海上能源全产业链博览会在上海隆重召开&#xff0c;同期举办第七届亚洲海洋风能大会。本次大会暨博览会由上海船舶工业行业协会、上海市工业合作协会、决策…

Linux网络编程——网络字节序和IP地址详解

一、网络字节序 1、大端模式和小端模式 字节序是指多字节数据的存储顺序&#xff0c;在设计计算机系统的时候&#xff0c;有两种处理内存中数据的方法&#xff1a;大端格式、小端格式。 小端格式(Little-Endian)&#xff1a;将低位字节数据存储在低地址&#xff1b; 大端格式(…

解析低代码开发在企业数字化转型中的多重优势

在数字化转型的浪潮中&#xff0c;企业面临着前所未有的机遇和挑战。为了在竞争激烈的市场中脱颖而出&#xff0c;企业需要迅速且高效地构建和更新应用程序&#xff0c;以适应不断变化的业务需求。数字化转型已不再是企业的选择&#xff0c;而是关乎生存和发展的必由之路。在这…

JMeter项目实战

目录 一、流程&#xff1a; 1.接口测试流程&#xff1a; 2.测试数据准备&#xff1a; 3.接口功能测试&#xff1a; 4.自动化测试流程&#xff1a; 5.情景压力测试分析&#xff1a; 6.生成图形化测试报告&#xff1a; 一、流程&#xff1a; 1.接口测试流程&#xff1a; …

SHARE 100M A10风力发电机动态巡检

背景 随着碳中和、碳达峰“3060”目标的提出&#xff0c;“十四五”时期乃至本世纪中叶应对气候变化工作、绿色低碳发展和生态文明建设提出了更高要求。在时代建设的背景下&#xff0c;清洁能源行业蓬勃发展&#xff0c;传统静态巡检模式与高度依赖人力的风机巡检运维手段已经无…

数据分析:宏基因组DESeq2差异分析筛选差异物种

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍原理:计算步骤:结果:加载R包准备画图主题数据链接导入数据Differential abundance (No BP vs 2BP TA)构建`countData`矩阵过滤低丰度物种构建DESeq数据对象DESeq2差异分析画图Di…

Linux进程信号(信号的产生)

目录 什么是信号&#xff1f; 信号的产生 信号产生方式1&#xff1a;键盘 前台进程 后台进程 查看信号 signal系统调用 案例 理解进程记录信号 软件层面 硬件层面 信号产生方式2:指令 信号产生方式3:系统调用 kill系统调用 案例 其他产生信号的函数调用 1.rais…

【ESP】一小时速通入门笔记

【ESP】一小时速通入门笔记 前言: 之前上学时就用过一次esp32, 当时初次使用搭建编译环境费了老大功夫.在我第一篇esp32笔记中也有说明.以至于我好像忘记记录完整的入门笔记了.最近因为工作需要又开始接触esp32才发现,现在已经方便得多了.顺利的话一小时速通. 前排提醒: 本笔记…

22.04Ubuntu---ROS2使用rclcpp编写节点C++

节点需要存在于功能包当中&#xff0c;功能包需要存在于工作空间当中。 所以我们要想创建节点&#xff0c;就要先创建一个工作空间&#xff0c;再创建功能包。 第一步&#xff1a;创建工作空间 mkdir -p chapt2_ws/src/ 第二步&#xff1a;创建example_cpp功能包&#xff0c…

QML项目实战:自定义CheckBox

目录 一.添加模块 import QtQuick.Controls 1.2 import QtQuick.Controls.Styles 1.4 import QtGraphicalEffects 1.15 二.自定义CheckBox 1.CheckBox设置 2.勾选框设置 3.标签部分 4. 状态变化处理 5.文本设置 三.效果 1.当enabled为true 2.当enabled为true 3.当…