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.mzph.cn/diannao/59349.shtml

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

相关文章

python和C数据互转

C -> Python 从C返回的地址获得一个int value ctypes.c_int.from_address(addr)得到一个c_int。 再调用c_int.value属性得到python int。 从C返回的地址获得一个struct 比如下面的结构&#xff1a; class DynamicListType(ctypes.Structure):_fields_ [("count&q…

数据集成技术:聚水潭与金蝶云星空的成功对接

聚水潭数据集成到金蝶云星空的技术案例分享 在企业信息化管理中&#xff0c;数据的高效流动和准确对接是确保业务顺畅运行的关键。本文将聚焦于一个具体的系统对接集成案例&#xff1a;如何通过轻易云数据集成平台&#xff0c;将聚水潭的采购入库数据无缝集成到金蝶云星空&…

Linux网络命令:它用于实时监控网络接口的状态变化的命令 ip monitor详解

目录 一、概述 二、使用 1、语法 2、对象类型 3、常用选项 4、获取帮助 三、 示例 1. 监视链路层变化 2. 监视所有的网络变化 3. 仅监视路由表的变化 4. 监视特定网络接口的状态变化&#xff1a; 5. 监视网络接口地址的变化 四、实际应用 五、其他事项 一、概述 …

仿微信项目-2-Socket模拟聊天室

利用 Socket 模拟一个服务器来统一接收和发送消息 再用 Socket 模拟若干的客户端 服务端代码&#xff1a; package com.wfChat.test;import java.io.*; import java.net.ServerSocket; import java.net.Socket; import java.util.HashMap; import java.util.Map;public clas…

Hive学习笔记

1 Hive基本概念 1.1 Hive定义 Hive&#xff1a;由 Facebook 开源用于解决海量结构化日志的数据统计工具。 Hive 是基于 Hadoop 的一个数据仓库工具&#xff0c;可以将结构化的数据文件映射为一张表&#xff0c;并 提供类 SQL 查询功能。 利用MapReduce去查询数据文件中的某些内…

ESRALLY安装与使用

ESRALLY安装与使用 geonames、geopoint:都是和地理位置相关的,如果需要测试ES在地理位置处理的性能可以选用 http_logs:是http_server的,如果要测服务器日志、redis日志、apache日志可以选用 说明:esrally 自带的测试数据即为 rally_track 文件夹中的内容,主要包括: Ge…

默认路由:实现内网所有网段流量走一条默认路由访问外网

默认路由 Tip&#xff1a;默认路由一般指出口网关设备的出口路由。实现所有网段流量都走一条路由。 实验模拟&#xff1a;公司内部pc 通过出口网关 访问运营商内部 baidu服务 isp网关配置&#xff1a; <Huawei>sy Enter system view, return user view with CtrlZ. …

算法工程师重生之第四十四天(岛屿数量 深搜 广搜 岛屿的最大面积)

参考文献 代码随想录 一、岛屿数量 题目描述 给定一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的矩阵&#xff0c;你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而成&#xff0c;并且四周都是水域。你可以假设矩阵外均被水包…

搭建你的私人云盘:使用File Browser与cpolar实现公网传输文件

文章目录 前言1.下载安装File Browser2.启动访问File Browser3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 File Browser是一个开源的文件管理器和文件共享工具&#xff0c;它可以帮助用户轻…

SpringBoot+Shiro权限管理

完善之前的博客里的项目&#xff0c;本博客主要讲述Shiro的权限管理模块 代码实例 引入依赖 <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring-boot-starter</artifactId> <version>1.7.0</version>…

【C++】布隆过滤器的概念与特点解析

&#x1f308; 个人主页&#xff1a;谁在夜里看海. &#x1f525; 个人专栏&#xff1a;《C系列》《Linux系列》 ⛰️ 天高地阔&#xff0c;欲往观之。 目录 00.引入 01.布隆过滤器的概念 特点1&#xff1a;极低的内存消耗 特点2&#xff1a;快速查询 特点3&#xff1a;假阳…

深入解析:云计算与虚拟化技术

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 # 深入解析&#xff1a;云计算与虚拟化技术 文章目录 云计算概述定义服务模型部署模型 虚拟化技术定义类型关键技术 云计算与虚…

React Router v6 中用于在导航到指定路由之前使用loader预加载数据

在 React Router v6 中&#xff0c;loader 函数用于在导航到某个路由之前预加载数据。这是非常有用的功能&#xff0c;特别是在需要从服务器获取数据并将其传递给组件的情况下。loader 函数可以帮助你提前获取数据&#xff0c;从而提高用户体验和应用性能。 loader 函数的作用…

Mybatis查询数据库,返回List集合,集合元素也是List。

#有时间需求会要求&#xff1a;查询全校的学生数据&#xff0c;且学生数据按班级划分。那么就需要List<List<user>>类型的数据。 SQL语句 SELECT JSON_ARRAYAGG(JSON_OBJECT(name , name ,BJMC, BJMC ,BJBH,BJBH)) as dev_user FROM dev_user WHERE project_id …

105. UE5 GAS RPG 搭建主菜单

在这一篇&#xff0c;我们将实现对打开游戏显示的主菜单进行搭建&#xff0c;主菜单将显示游戏主角&#xff0c;游戏名称和进入游戏和退出游戏两个按钮。 搭建菜单场景 我们将主菜单设置为一个单独的场景&#xff0c;前面可以显示对应的UI控件&#xff0c;用于玩家操作&#…

cangjie仓颉编程语言学习Note-2.标准库学习

cangjie仓颉编程语言学习Note-2.标准库学习 当前仓颉标准库提供了几乎涵盖常见开发所使用的常见库&#xff0c;这一点很赞&#xff01; 详细模块如下&#xff1a; std: 意指标准库&#xff0c;标准库是指在编程语言中预先定义的一组函数、类、结构体等&#xff0c;旨在提供常…

时间序列预测(十八)——实现配置管理和扩展命令行参数解析器

如图&#xff0c;这是一个main,py文件&#xff0c;在此代码中&#xff0c;最开始定义了许多模型参数&#xff0c;为了使项目更加灵活和可扩展&#xff0c;便于根据不同的需求调整参数和配置&#xff0c;可以根据实际需要扩展参数和配置项。 下面是如何实现配置管理和扩展命令行…

Ubuntu用docker安装AWVS和Nessus(含破解)

Ubuntu安装AWVS(更多搜索&#xff1a;超详细Ubuntu用docker安装AWVS和Nessus) 首先安装docker&#xff0c;通过dockers镜像安装很方便&#xff0c;且很快&#xff1b;Docker及Docker-Compose-安装教程。 1.通过docker search awvs命令查看镜像&#xff1b; docker search awvs…

QT for android 问题总结(QT 5.15.2)

1.配置好的sdk&#xff0c;显示设置失败 Android SDK Command-line Tools run. Android Platform-Tools installed. Command-line Tools (latest) 版本过高导致报错 &#xff0c;下载一个低版本的latest &#xff0c;替换掉之前latest中的文件。即可&#xff0c;latest 路径如…

Jmeter5.X性能测试

Jmeter5.X性能测试 文章目录 Jmeter5.X性能测试一、掌握Http基础协议1.1 浏览器的B/S架构和C/S架构1.2 HyperText Transfer Protocol 超文本传输协议1.3 超文本传输协议Http消息体拆分讲解1.4 HTTP的九种请求方法和响应码介绍1.5 Http请求头/响应头1.6 Http常见请求/响应头cont…