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

news2024/9/23 22:20:38

接着上篇博客学习。上篇博客是已经基本完成用户模块的注册接口的开发。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 {

    @Autowired
    private 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 {

    @Autowired
    private 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...)

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

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

相关文章

最新版Visual Studio安装教程(超详细,新手必看)

一、官网下载 这里奉上Visual Studio官方下载地址&#xff1a; https://visualstudio.microsoft.com/zh-hans/downloads/https://visualstudio.microsoft.com/zh-hans/downloads/ 对于我们学习来说&#xff0c;下载第一个社区免费版即可&#xff0c;点击下载。 下载完成以后是…

Kubernetes Pod调度基础(kubernetes)

实验环境依旧是k8s快照&#xff0c;拉取本次实验所需的镜像文件&#xff1b; 然后在master节点上传已经编写好的yaml文件&#xff1b; 然后同步会话&#xff0c;导入镜像&#xff1b; pod控制器&#xff1a; 标签选择器--》标签&#xff1a; 标签&#xff1a; 在Kubernetes&…

还在用windows自带录屏?试试这三款录屏工具

作为一名办公室文员&#xff0c;我经常需要录制电脑屏幕来制作教程或者记录工作流程。在众多的录屏工具中&#xff0c;我尝试了四款不同的录屏工具&#xff0c;包括Windows自带录屏工具。今天&#xff0c;我就来跟大家分享一下我的使用体验&#xff0c;希望能帮助到和我有同样需…

利用代码,玩转腾讯云脱敏服务:Java、Python、PHP案例集

腾讯云数据脱敏服务-数据管理的优势是什么&#xff1f; 腾讯云数据脱敏服务-数据管理 提供了一种高效且灵活的方式来保护敏感数据。其核心优势在于可以在数据处理和传输过程中自动化地执行数据脱敏操作。无论是脱敏信用卡号、身份证号还是其他个人信息&#xff0c;该服务都能精…

Games101笔记-二维Transform变换(二)

1、什么是Transform Transform就是通过一个矩阵&#xff0c;进行缩放、旋转、平移等变换 2、缩放、旋转、切变、平移等基础变换 缩放变换&#xff1a; 反射变换&#xff1a; 切变&#xff1a; 绕原点旋转&#xff1a; 以上都是线性变换&#xff1a; 平移变换&#xf…

线程同步:消费者模型(非常重要的模型)

一.线程同步的概念 线程同步&#xff1a;是指在互斥的基础上&#xff0c;通过其它机制实现访问者对 资源的有序访问。条件变量&#xff1a;线程库提供的专门针对线程同步的机制线程同步比较典型的应用场合就是 生产者与消费者 二、生产者与消费者模型原理 在这个模型中&…

中文文本分词-技术实现

当做语音&文本相关的技术时&#xff0c;经常会涉及到文本的分词实现。以下是对中文的文本简单实现。 一、单个中文句子的分词 import jiebatext_ "我爱我的祖国&#xff01;" # 精确模式 seg_list jieba.cut(text_, cut_allFalse) print("精确模式: &qu…

【51实物与仿真】基于51单片机设计的波形/函数发生器(正弦波、锯齿波、三角波、矩形波,设定频率步进值,改变振幅,LCD显示)——文末完整资料链接

基于51单片机设计的波形函数发生器 演示视频: 功能简介: 1.本设计基于STC89C51/52(与AT89S51/52、AT89C51/52通用,可任选)单片机。 2.LCD1602液晶显示波形种类和频率值(10-100HZ)。 3.按键设置波形种类和设定频率步进值。 4.电位器器改变振幅(0V-3.5V稳定)。 5…

医院预约|基于springBoot的医院预约挂号系统设计与实现(附项目源码+论文+数据库)

私信或留言即免费送开题报告和任务书&#xff08;可指定任意题目&#xff09; 目录 一、摘要 二、相关技术 三、系统设计 四、数据库设计 五、核心代码 六、论文参考 七、源码获取 一、摘要 近年来&#xff0c;信息化管理行业的不断兴起&#xff0c;使得人们的日…

集合根据上下级关系转树结构

1、创建实体对象 public class TreeNode {private String id;private String pid;private String name;private List<TreeNode> children;public TreeNode(String id,String pid,String name){this.id id;this.pid pid;this.name name;}public String getId() {retur…

独立游戏《Project:Survival》UE5C++开发日志0——游戏介绍

该游戏是《星尘异变》团队的下一款作品&#xff0c;太空科幻题材的生存游戏&#xff0c;我将负责使用C、蓝图实现游戏的基础框架和核心功能&#xff0c;其中还包含使用人工智能算法助力游戏开发或帮助玩家运营 目前已有功能&#xff1a; 1.3D库存系统&#xff1a;所有库存中的物…

Python练习宝典:Day 3 - 选择题 - 字符串与正则表达式、基础练习补充

目录 一、基础练习补充二、字符串与正则表达式 一、基础练习补充 1.下列能返回变量s的数据类型的是: A.print(type(s)) B.print(s) C.print(int(s)) D.print(str(s))2.如果想要换行,可以使用: A.\ B.\n C.\t D.\f3.合法的标识符是: A.M-N B.and C.Dior_Ysl D.6_friends4.在…

计算机毕业设计springboot+vue项目分享在线服务平台

目录 功能和技术介绍系统实现截图开发核心技术介绍&#xff1a;使用说明开发步骤编译运行需求分析系统设计软件测试核心代码部分展示详细视频演示源码获取 功能和技术介绍 本项目包含程序源码和MySql脚本和文档,idea开发,支持Eclipse。使用vue的本质是SpringFramework【IoC&am…

【门牌制作 / A】

题目 代码 #include <bits/stdc.h> using namespace std; int main() {int cnt 0;for (int i 1; i < 2020; i){string s;s to_string(i);cnt count(s.begin(), s.end(), 2);}cout << cnt; }

用c++实现分数(fraction)类

这个想法已经有3周&#xff0c;于是今天将它实现了。 Step 1基础&#xff1a; 我们需要定义一个class——fraction&#xff0c;全部属性定义为public class fraction{ public:}; 现在&#xff0c;让我们添加2个元素&#xff0c;分子和分母——fz和fw Step 1.1添加分子分母…

QT| “无法粘贴窗口部件”错误以及customplot

“无法粘贴窗口部件”错误以及customplot “无法粘贴窗口部件”错误customplot下载添加到项目中使用QCustomPlot常用的代码 “无法粘贴窗口部件”错误 情景&#xff1a;使用QT设计界面&#xff0c;很多部分比较类似&#xff0c;可以复制另一个界面的ui&#xff0c;但是粘粘的时…

c++278函数指针

#define _CRT_SECURE_NO_WARNINGS #include<stdlib.h> #include<string.h> #include<stdio.h>//数组类型基本语法知识梳理 //定义一个数组类型 //int a[10];//定义一个指针数组类型//定义一个指向数组类型的指针 数组类型的指针void main() {int a[10];//a代…

“AI+Security”系列第3期(二):AI赋能自动化渗透测试

近日&#xff0c;“AI Security” 系列第 3 期&#xff1a;AI 安全智能体&#xff0c;重塑安全团队工作范式技术沙龙活动正式举行。该活动由安全极客、Wisemodel 社区、InForSec 网络安全研究国际学术论坛和海升集团联合主办&#xff0c;吸引了线上与线下千余名观众参与。 在…

数据结构基础详解:拓扑排序和关键路径_AOE网的详细画法

文章目录 1.有向无环图&#xff08;前置知识&#xff09;2. 拓扑排序2.1 AOV网2.2 排序序列 3.关键路径3.1 AOE网3.2 关键活动3.2.1 事件v~k~的最早发生时间v~e~(k)3.2.2 活动a~I~的最迟开始时间l(i)3.2.3 事件v~k~的最迟发生时间v~l~(k)3.2.4 活动a~I~的最早开始时间e(i)3.2.5…

插件MyBatis X

文章目录 插件插件MyBatis X 插件 插件MyBatis X 安装完重启idea 蓝色 sql映射文件 红色 mapper接口 点击对应的鸟&#xff0c;sql映射文件和对应mapper接口就能相互跳转