当前位置: 首页 > news >正文

springboot实战学习笔记(4)(Spring Validation参数校验框架、全局异常处理器)

接着上篇博客学习。上篇博客是已经基本完成用户模块的注册接口的开发。springboot实战学习笔记(3)(Lombok插件、postman测试工具、MD5加密算法、post请求、接口文档、注解、如何在IDEA中设置层级显示包结构、显示接口中的方法)-CSDN博客本篇博客主要是关于用户模块的”注册“的后端所有接口的写法。其中主要包括:插件lombok(自动生成getter、setter等等方法)、注解@Data、接口开发文档、post请求、Md5加密算法运用、如何在IDEA中设置包结构层级展示以及设置所以接口中的方法展示、测试工具postman的使用等等......https://blog.csdn.net/m0_74363339/article/details/142312514但是忘记去做一个参数校验(因为接口文档中对username、password有一个限制)。我们要保证前端传进来的参数,不符合这个规则,是不能完成注册的!!

目录

1、对参数"username"与"password"进行手动校验。

2、回看手动参数校验。

3、参数校验框架。Spring Validation。

(1)基本介绍

(2)基本使用场景

(3)总体作用

(4)在该注册接口中的具体操作

第一步。在pom文件中添加Validation依赖。

第二步。在需要校验的参数前添加注解@Pattern,并且给它里面的参数"regexp"赋值(正则表达式)。其中"\\S"的介绍如下。

第三步。需要在本类上使用注解@Validated。

重启工程,并在测试工具postman中测试接口。

因为上面测试时,参数调用失败,则会抛出一个异常如上。然后显示一个status:"500",这不知道哪里出了问题。不符合接口文档里面提供的响应信息的格式。所以得继续完善,对上面的异常进行处理。

4、全局异常处理器(处理参数校验失败的异常)(GlobalExceptionHandler)

(1)基本介绍

(2)在注册接口所在的项目"big-event"开始操作。

5、总结


1、对参数"username"与"password"进行手动校验。

package com.feisi.controller;import com.feisi.pojo.Result;
import com.feisi.pojo.User;
import com.feisi.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** @Title: UserController* @Author HeYouLong* @Package com.feisi.controller* @Date 2024/9/17 下午1:51* @description:*/
@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;@PostMapping("/register")public Result register(String username, String password) {if(username!=null && username.length()>=5 && username.length()<=16 && password!=null && password.length()>=5 && password.length()<=16){//查询用户User user = userService.findByName(username);if(user==null){//没有占用//注册userService.register(username,password);return Result.success();}else {//被占用return Result.error("用户名已被占用");}}else {return Result.error("参数不合法");}}
}

2、回看手动参数校验。

  • 往前看之前写的手动参数校验的代码非常繁琐,关是两个参数就很麻烦了,所以还需要改进才行!!

3、参数校验框架。Spring Validation

Spring 提供的一个参数校验框架,使用预定义的注解完成参数校验

(1)基本介绍
  • 提供了一种声明式验证机制,可以在不侵入业务代码的情况下,对数据进行校验。
(2)基本使用场景
  • 在表单提交时验证用户输入的数据。
  • 在数据持久化之前验证数据的完整性和正确性。
  • 在服务层或业务层进行数据转换或处理前的验证。
(3)总体作用
  • Spring Validation 提供了灵活且强大的数据验证能力,是开发过程中不可或缺的一个工具。
(4)在该注册接口中的具体操作

  • 第一步。在pom文件中添加Validation依赖。

第一次添加该依赖需要手动打,然后刷新Maven,本地仓库没有就让它去镜像里下载

  • 第二步。在需要校验的参数前添加注解@Pattern,并且给它里面的参数"regexp"赋值(正则表达式)。其中"\\S"的介绍如下。

(正则表达式中的"^$"是一个非常特殊的模式,它用来匹配空字符串,也就是说,这个模式会匹配那些长度为0的字符串,即没有任何字符的字符串。解释:"^"表示字符串的开始位置。"$"表示字符串的结束位置。当这两个符号连在一起使用时,它们之间没有任何其他字符,因此这个正则表达式只能匹配那些开始和结束位置重合的字符串,即空字符串)

"\S"是 另一个特殊的元字符,用于匹配任何非空白字符。不过,注意在大多数编程语言中,"反斜杠 \ "是一个转义字符,所以当你想要在字符串中表示一个反斜杠时,你通常需要写"两个反斜杠\\"

@Pattern(regexp = "^$")
public Result register(@Pattern(regexp = "^\\S{5,16}$") String username,@Pattern(regexp = "^\\S{5,16}$") String password) {
//
//
}
  • 第三步。需要在本类上使用注解@Validated
package com.feisi.controller;import com.feisi.pojo.Result;
import com.feisi.pojo.User;
import com.feisi.service.UserService;
import jakarta.validation.constraints.Pattern;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** @Title: UserController* @Author HeYouLong* @Package com.feisi.controller* @Date 2024/9/17 下午1:51* @description:*/
@RestController
@RequestMapping("/user")
@Validated
public class UserController {@Autowiredprivate UserService userService;@PostMapping("/register")public Result register(@Pattern(regexp = "^\\S{5,16}$") String username,@Pattern(regexp = "^\\S{5,16}$") String password) {//查询用户User user = userService.findByName(username);if(user==null){//没有占用//注册userService.register(username,password);return Result.success();}else {//被占用return Result.error("用户名已被占用");}}
}
  • 重启工程,并在测试工具postman中测试接口。

  • 因为上面测试时,参数调用失败,则会抛出一个异常如上。然后显示一个status:"500",这不知道哪里出了问题。不符合接口文档里面提供的响应信息的格式。所以得继续完善,对上面的异常进行处理。

4、全局异常处理器(处理参数校验失败的异常)(GlobalExceptionHandler)

(1)基本介绍

  • 创建一个类。然后在类上添加注解@RestControllerAdvice。用它来标识这个类是用来处理异常的。
  • 因为我们添加的是注解@RestXXX。所以这个类里面的所有方法的返回值都会被转换成JSON字符串,响应给浏览器。
  • 然后在类里面需要添加一个方法去处理异常。在方法上需要添加注解@ExceptionHandler(Exception.class)。"Exception.class"是指处理所有的异常
  • 这个方法的返回值是result。当出了异常,返回的结果也是会满足接口文档的要求。
(2)在注册接口所在的项目"big-event"开始操作。
  • 在com.feisi包下创建一个包(exception)。

  • 再在包下创建一个类"GlobalExceptionHandler"。

  • 在类上添加一个注解@RestControllerAdvice。在类的内部添加一个方法handException(),方法上要写一个注解@ExceptionHandler(Exception.class)。方法返回值是Result对象。在Exception会封装一个错误提示信息"e.getMessge()",但是一些异常信息并没有封装。所以还要用到Spring提供的String字符串的工具类"StringUtils"的hasLength()方法,问返回的return的"e.getMessage()"是否存在错误原因,若没有就返回"操作失败"。
package com.feisi.exception;import com.feisi.pojo.Result;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;/*** @Title: GlobalExceptionHandler* @Author HeYouLong* @Package com.feisi.exception* @Date 2024/9/18 下午2:59* @description:*/
@RestControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(Exception.class)public Result handleException(Exception e) {  //在方法里参数要声明一个变量去接收,一旦捕获到异常对象就要处理e.printStackTrace();return Result.error(StringUtils.hasLength(e.getMessage())?e.getMessage():"操作失败");}
}
  • 重启工程。再次去postman测试接口。

5、总结

  • 本篇博客使用Validation对注解接口的参数进行了校验。
  • 要使用Validation需要做的几步如下。(其中它不只有一个注解@Pattern...)

相关文章:

springboot实战学习笔记(4)(Spring Validation参数校验框架、全局异常处理器)

接着上篇博客学习。上篇博客是已经基本完成用户模块的注册接口的开发。springboot实战学习笔记&#xff08;3&#xff09;(Lombok插件、postman测试工具、MD5加密算法、post请求、接口文档、注解、如何在IDEA中设置层级显示包结构、显示接口中的方法)-CSDN博客本篇博客主要是关…...

网络七层协议

网络七层协议&#xff0c;也称为OSI&#xff08;Open Systems Interconnection&#xff09;参考模型&#xff0c;是由国际标准化组织&#xff08;ISO&#xff09;提出的一种网络通信的协议分层模型。该模型将网络通信过程划分为七个层次&#xff0c;从下到上依次为物理层、数据…...

从 Oracle 集群到单节点环境(详细记录一次数据迁移过程)之一:生产环境与目标服务器详情

从 Oracle 集群到单节点环境&#xff08;详细记录一次数据迁移过程&#xff09;之一&#xff1a;生产环境与目标服务器详情 目录 从 Oracle 集群到单节点环境&#xff08;详细记录一次数据迁移过程&#xff09;之一&#xff1a;生产环境与目标服务器详情一、操作系统环境二、Or…...

【软件测试】详解测试中常用的几种测试方法

目录 一、集成测试二、 系统测试三、验收测试四、回归测试 总结 一、集成测试 术语 集成测试是继组件测试之后的又一个层次。集成测试假定交给这个层次的测试对象已经经过了组件测试&#xff0c;并且任何组件内部的缺陷都已经尽可能地被纠正。 集成 开发人员、测试人员和专…...

开始学习深度学习-前言

作为一个外行&#xff0c;想学习一下深度学习。有些理解可能会很幼稚&#xff0c;特此记录一下。 深度学习&#xff0c;看起来高大上&#xff0c;其实用到的数学知识&#xff0c;也不是多高深&#xff0c;都是基本的数字。如果有不理解的&#xff0c;可以问一下chatGPT&#xf…...

Liveweb视频汇聚平台支持GB28181转RTMP、HLS、RTSP、FLV格式播放方案

GB28181协议凭借其在安防流媒体行业独有的大统一地位&#xff0c;目前已经在各种安防项目上使用。雪亮工程、幼儿园监控、智慧工地、物流监控等等项目上目前都需要接入安防摄像头或平台进行直播、回放。而GB28181协议作为国家推荐标准&#xff0c;目前基本所有厂家的安防摄像头…...

详解c++:new和delete

文章目录 前言一、new和mallocnew的用法&#xff08;爽点&#xff09;自动构造 delete和freedelete的用法&#xff08;爽点&#xff09; 提醒 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 在C中&#xff0c;new 和 delete 是两个非常重要的操作符&am…...

【深度学习】(5)--搭建卷积神经网络

文章目录 搭建卷积神经网络一、数据预处理1. 下载数据集2. 创建DataLoader&#xff08;数据加载器&#xff09; 二、搭建神经网络三、训练数据四、优化模型 总结 搭建卷积神经网络 一、数据预处理 1. 下载数据集 在PyTorch中&#xff0c;有许多封装了很多与图像相关的模型、…...

边学英语边学 Java|Synchronization in java

Why use Java Synchronization? Java Synchronization is used to make sure by some synchronization method that only one thread can access the resource at a given point in time. Java 同步用于确保通过某种同步方法&#xff0c;在给定的时间点只有一个线程可以访问资…...

k8s StorageClass 存储类

文章目录 一、概述1、StorageClass 对象定义2、StorageClass YAML 示例 二、StorageClass 字段1、provisioner&#xff08;存储制备器&#xff09;1.1、内置制备器1.2、第三方制备器 2、reclaimPolicy&#xff08;回收策略&#xff09;3、allowVolumeExpansion&#xff08;允许…...

3D Slicer医学图像全自动AI分割组合拳-MONAIAuto3DSeg扩展

3D Slicer医学图像全自动AI分割组合拳-MONAIAuto3DSeg扩展 1 官网下载最新3D Slicer image computing platform | 3D Slicer 版本5.7 2 安装torch依赖包&#xff1a; 2.1 进入安装目录C:\Users\wangzhenlin\AppData\Local\slicer.org\Slicer 5.7.0-2024-09-21\bin&#xff0…...

分布式光伏的发电监控

国拥有丰富的清洁可再生能源资源储量&#xff0c;积极开发利用可再生能源&#xff0c;为解决当前化石能源短缺与环境污染严重的燃眉之急提供了有效途径[1]。但是可再生能源的利用和开发&#xff0c;可再生能源技术的发展和推广以及可再生能源资源对环境保护的正向影响&#xff…...

微信小程序----日期时间选择器(自定义时间精确到分秒)

目录 页面效果 代码实现 注意事项 页面效果 代码实现 js Component({/*** 组件的属性列表*/properties: {pickerShow: {type: Boolean,},config: Object,},/*** 组件的初始数据*/data: {pickerReady: false,// pickerShow:true// limitStartTime: new Date().getTime()-…...

3D生成技术再创新高:VAST发布Tripo 2.0,提升AI 3D生成新高度

随着《黑神话悟空》的爆火&#xff0c;3D游戏背后的AI 3D生成技术也逐渐受到更多的关注。虽然3D大模型的热度相较于语言模型和视频生成技术稍逊一筹&#xff0c;但全球的3D大模型玩家们却从未放慢脚步。无论是a16z支持的Yellow&#xff0c;还是李飞飞创立的World Labs&#xff…...

ONNX Runtime学习之InferenceSession模块

ONNXRuntime库学习之InferenceSession(模块) 一、简介 onnxruntime.InferenceSession 是 ONNX Runtime 中用于加载和运行 ONNX 模型的核心模块。它提供了一种灵活的方式来在多种硬件设备&#xff08;如 CPU、GPU&#xff09;上执行 ONNX 模型推理。通过 InferenceSession&…...

【TS】TypeScript内置条件类型-ReturnType

ReturnType 在TypeScript中&#xff0c;ReturnType 是一个内置的条件类型&#xff08;Conditional Type&#xff09;&#xff0c;它用于获取一个函数返回值的类型。这个工具类型非常有用&#xff0c;特别是当你需要引用某个函数的返回类型&#xff0c;但又不想直接写出那个具体…...

【c语言数据结构】超详细!模拟实现双向链表(初始化、销毁、头删、尾删、头插、尾插、指定位置插入与删除、查找数据、判断链表是否为空)

特点&#xff1a; 结构&#xff1a;指向前一结点指针数据指向后一结点指针由于循环&#xff0c;尾结点的下一结点next指向头结点&#xff08;哨兵结点&#xff09;空的双向链表只有自循环的哨兵结点&#xff08;头结点&#xff09; 模拟实现双向链表 LIST.h #define _CRT_…...

第十四届蓝桥杯嵌入式国赛

一. 前言 本篇博客主要讲述十四届蓝桥杯嵌入式的国赛题目&#xff0c;包括STM32CubeMx的相关配置以及相关功能实现代码以及我在做题过程中所遇到的一些问题和总结收获。如果有兴趣的伙伴还可以去做做其它届的真题&#xff0c;可去 蓝桥云课 上搜索历届真题即可。 二. 题目概述 …...

(k8s)kubernetes集群基于Containerd部署

资源列表 基础环境 一、基础环境准备 1.1、关闭Swap分区 1.2、添加hosts解析 1.3、桥接的IPv4流量传递给iptables的链 二、准备Containerd容器运行时 2.1、安装Containerd 2.2、配置Containerd 2.3、启动Containerd 三、部署Kubernetes集群 3.1、安装Kubeadm工具 3.2、…...

python内置模块pathlib.Path类操作目录和文件

python自带的pathlib模块提供了很多路径相关的功能&#xff0c;而pathlib.Path 是pathlib 模块中的一个核心类&#xff0c;它代表了文件系统中的一个路径&#xff0c;实现功能比如创建、删除、移动文件&#xff0c;读取和写入文件内容&#xff0c;遍历目录等。 Path 类跟os.pa…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...

如何应对敏捷转型中的团队阻力

应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中&#xff0c;明确沟通敏捷转型目的尤为关键&#xff0c;团队成员只有清晰理解转型背后的原因和利益&#xff0c;才能降低对变化的…...

tauri项目,如何在rust端读取电脑环境变量

如果想在前端通过调用来获取环境变量的值&#xff0c;可以通过标准的依赖&#xff1a; std::env::var(name).ok() 想在前端通过调用来获取&#xff0c;可以写一个command函数&#xff1a; #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...

华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)

题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...

ubuntu22.04有线网络无法连接,图标也没了

今天突然无法有线网络无法连接任何设备&#xff0c;并且图标都没了 错误案例 往上一顿搜索&#xff0c;试了很多博客都不行&#xff0c;比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动&#xff0c;重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...