当前位置: 首页 > 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…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...