spring boot3参数校验基本用法

⛰️个人主页:     蒾酒

🔥系列专栏:《spring boot实战》

🌊山高路远,行路漫漫,终有归途。


目录

前置条件

前言

导入依赖

使用介绍

配置检验规则

开启校验

使用注意

全局异常捕获返回友好提示信息

常用的校验规则注解

使用技巧


前置条件

已经初始化好一个spring boot项目且版本为3X,项目可正常启动。

作者版本为3.2.2

初始化教程:

新版idea(2023)创建spring boot3项目_2023年版的idea用maven创建springboot项目-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/qq_62262918/article/details/135785412?spm=1001.2014.3001.5501

前言

在spring boot应用程序开发中对于参数校验这一块我们通常使用注解的方式来完成,本文我们介绍关于spring boot注解化参数校验的初级使用。

导入依赖

pom.xml:

  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-validation</artifactId>
  </dependency>

注意:spring boot2.3以后默认spring-boot-starter-web组件不包含该依赖需要单独引入

使用介绍

配置检验规则

现在有一个用户登录请求对象

import jakarta.validation.constraints.*;
import lombok.Data;


/**
 * @author mijiupro
 */
@Data
public class UserLoginDTO {
    @NotBlank(message = "账号不能为空")
    private String userAccount;// 用户账号
    @Size(min = 6, max = 18, message = "用户密码长度需在6-18位")
    private String password;// 密码
    @NotBlank(message = "验证码id不能为空")
    private String captchaId;// 验证码id
    @NotBlank(message = "验证码内容不能为空")
    private String captcha;// 验证码内容
}

我们使用@Size对字符串密码字段设置长度范围6-18位校验规则,其他字段使用@NotBlank设置非空校验。

注意事项:

此时校验并不会生效,因为我们只配置了规则,并没有开启校验。

开启校验

通常我们在控制层进行参数校验,通过对请求参数使用@Validated注解或者@Valid注解来启用校验。

@RestController
@RequestMapping("/user")
@Tag(name = "用户管理", description = "用户管理")
public class UserController {
    private final UserService userService;

    public UserController(UserService userService) {
        this.userService = userService;
    }

    @PostMapping("/login")
    @Operation(summary = "用户登录")
    public UserLoginVO login(@RequestBody @Validated UserLoginDTO userLoginDTO) {
        return userService.login(userLoginDTO);
    }

}

注意事项:

在spring boot推荐用@Validated注解,因为它能够支持 Spring 提供的校验注解,并且具有更好的集成性。

@Validated和@Valid区别:

  • @Validated注解是 Spring 框架提供的,主要用于在 Spring MVC 中对控制器的方法参数进行校验。
  • @Valid注解是 Java 标准库提供的,用于在任何地方触发参数校验,包括 Spring MVC 的控制器方法、Spring Boot 的 REST 控制器方法、Spring Data JPA 的实体类等。

使用注意

控制器方法接收到请求参数后,会进行参数校验,对于未通过校验规则的非法参数会抛出MethodArgumentNotValidException.class异常并打印出注解中传入的message提示信息参数

如图:

可以看到参数未通过返回的信息很不友好,我们需要通过全局异常捕获来处理一下返回友好的提示信息。

全局异常捕获返回友好提示信息

请确保配置了全局异常捕获:

Spring Boot3自定义异常及全局异常捕获-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/qq_62262918/article/details/136110267?spm=1001.2014.3001.5501

我们只需要添加一个方法来捕获MethodArgumentNotValidException.class返回友好信息即可。

    // 参数校验异常
    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public Result<String> handleValidationExceptions(Exception ex) {
        log.error(ex.getMessage());
        // 从异常中获取字段错误信息
        FieldError fieldError = ((MethodArgumentNotValidException) ex).getBindingResult().getFieldError();
        if (fieldError != null) {
            // 获取错误提示信息
            String errorMessage = fieldError.getDefaultMessage();
            log.error(errorMessage);
            return Result.error(errorMessage);
        } else {
            // 如果没有字段错误,返回默认错误信息
            log.error(ex.getMessage());
            return Result.error("请求参数验证失败");
        }
    }

常用的校验规则注解

  1. @NotNull:用于标记字段或方法参数不能为空。非null
  2. @NotEmpty:用于标记集合、数组、字符串不能为空。非空集合、数组、字符串
  3. @NotBlank:用于标记字符串不能为空且长度必须大于0。非null且非空字符串
  4. @Size:用于标记集合、数组、字符串长度必须在指定范围内。
  5. @Min:用于标记数字类型的最小值。
  6. @Max:用于标记数字类型的最大值。
  7. @Email:用于标记字符串必须为邮箱格式。

使用技巧

@NotNull用于一般的非空校验,@NotEmpty用于集合、数组、字符串的非空校验,@NotBlank则用于字符串的非空校验且长度必须大于0。

@NotNull注解只要求不为null,无法处理空字符,空字符串在它这里是通过的。

@NotBlank注解不仅要求不为null,还会要求去除前后空格后长度大于0,也就是它要求不能是空字符串。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Sparse MLP

上图展示了本文网络的整体架构。与ViT、MLP-Mixer和Swin Transformer类似&#xff0c;空间分辨率为HW的输入图像被分割为不重叠的patch。作者在网络中采用了44的patch大小&#xff0c;每个patch被reshape成一个48维的向量&#xff0c;然后由一个线性层映射到一个c维embedding i…

可解决95%以上问题的Linux命令!能用到退休

对于我们程序员来说&#xff0c;我们始终绕不过去要与 Linux 系统打交道。很多人&#xff0c;特别是新手程序员&#xff0c;一看到 Linux 系统那个小黑框&#xff0c;就发怵&#xff0c;其实&#xff0c;如果你真正去深入了解了&#xff0c;然后再学会一些常用的命令&#xff0…

网络入山太困难?看格行随身WiFi如何助力大山教育!

近日&#xff0c;一则关于偏远大山的上网问题冲上了热搜&#xff0c;引发了社会关注。虽然很多山区都已经通了电、通了网&#xff0c;但是在一些贫困的地区&#xff0c;网络基础设施依旧薄弱&#xff0c;村民想要使用固定宽带&#xff0c;仍然十分困难。 而在山区的学生们&…

每日OJ题_二叉树dfs②_力扣129. 求根节点到叶节点数字之和

目录 力扣129. 求根节点到叶节点数字之和 解析代码 力扣129. 求根节点到叶节点数字之和 129. 求根节点到叶节点数字之和 难度 中等 给你一个二叉树的根节点 root &#xff0c;树中每个节点都存放有一个 0 到 9 之间的数字。 每条从根节点到叶节点的路径都代表一个数字&am…

Unable to make field private JavacProcessingEnvironment$DiscoveredPro报错解决办法

maven项目打包报错 报错信息 Unable to make field private com.sun.tools.javac.processing.JavacProcessingEnvironment$DiscoveredProcessors com.sun.tools.javac.processing.JavacProcessingEnvironment.discoveredProcs accessible: module jdk.compiler does not &q…

【最新Dubbo3深入理解】Dubbo特性、工作原理以及负载均衡策略

欢迎关注公众号&#xff08;通过文章导读关注&#xff1a;【11来了】&#xff09;&#xff0c;及时收到 AI 前沿项目工具及新技术的推送&#xff01; 在我后台回复 「资料」 可领取编程高频电子书&#xff01; 在我后台回复「面试」可领取硬核面试笔记&#xff01; 文章导读地址…

SpringAop是什么?

简单介绍&#xff1a; AOP&#xff1a;Aspect Oriented Programming (面向切面编程、面向方面编程)&#xff0c;其实就是面向特定方法编程。 场景&#xff1a; 比如现在有一个需求&#xff0c;我要统计每一个业务方法的耗时时长&#xff0c; 我们只需在业务方法的前面获取一个…

ThreadLocal(5):ThreadLocalMap源码分析

在分析ThreadLocal方法的时候&#xff0c;我们了解到ThreadLocal的操作实际上是围绕ThreadLocalMap展开的。ThreadLocalMap的源码相对比较复杂, 我们从以下三个方面进行讨论。 1 基本结构 ​ ThreadLocalMap是ThreadLocal的内部类&#xff0c;没有实现Map接口&#xff0c;用独…

Python三级考试笔记

Python三级考试笔记【源源老师】 三级标准 一、 理解编码、数制的基本概念&#xff0c;并且会应用。 1. 能够进行二进制、十进制以及十六进制之间的转换&#xff1b; 2. 理解Python中的数制转换函数。 二、 掌握一维数据的表示和读写方法&#xff0c;能够编写程序处理一维数据…

QT 文本编辑框textBrowser接收数据保持光标在底部的方法

目录 1.实现效果2.代码 1.实现效果 2.代码 右键textBrowser加入触发信号textChanged&#xff1a; 双击&#xff0c;跳转到槽函数&#xff1a;(文本更改时执行该函数) void Widget::updata_textBrowser() void Widget::on_textBrowser_textChanged() {//光标移动至底部ui->…

npm install 安装依赖如何加速

在使用npm安装依赖时&#xff0c;有几种方法可以加速这一过程&#xff0c;尤其是在面临网络限制或npm官方源速度慢的情况下。以下是一些常用的加速技巧&#xff1a; 1. 使用国内镜像源 国内有几个镜像源可以提供更快的下载速度&#xff0c;例如淘宝npm镜像。你可以通过以下命…

Android挖取原图中心区域RectF(并框线标记)放大到ImageView宽高,Kotlin

Android挖取原图中心区域RectF(并框线标记)放大到ImageView宽高&#xff0c;Kotlin 红色线框区域即为选中的原图中心区域&#xff0c;放大后放到等宽高的ImageView里面。 import android.content.Context import android.graphics.Bitmap import android.graphics.BitmapFactor…

Java - @JSONField和@JsonProperty注解

JSONField注解是阿里巴巴的fastjson框架中的注解&#xff0c;用于指定JSON字符串中的属性名和Java对象中的属性名之间的映射关系 JsonProperty注解是Jackson框架中的注解&#xff0c;用法类似于JSONField&#xff0c;也是指定JSON字符串中的属性名和Java对象中的属性名之间的映…

浮毛克星:猫毛过敏也能解决?宠物空气净化器品牌推荐

有些人认为对猫咪过敏是因为它们在空气中漂浮的毛发导致的。实际上&#xff0c;大部分人对猫咪过敏是由于它们身上的一种微小蛋白质引起的。这种过敏原蛋白质附着在猫咪的一些皮屑上。猫咪通常会通过舔毛的方式保持自己的清洁&#xff0c;舔毛的过程会导致这些皮屑携带蛋白质进…

阿赵UE学习笔记——16、渲染性能相关

阿赵UE学习笔记目录 大家好&#xff0c;我是阿赵。   继续学习虚幻引擎的使用。上一篇说了灯光的移动性问题&#xff0c;这一篇来看看怎样去辨别灯光性能的好坏。   虚幻引擎里面有一组显示模式是专门用来看场景当前的灯光和网格渲染的&#xff0c;叫做优化试图模式&#x…

基于java eclipse+jsp+mysql+servlet+Spring的学生信息管理系统基础版

基于java eclipsejspmysqlservletSpring的学生信息管理系统基础版 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写> 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于…

营销系统黑名单优化:位图的应用解析 | 京东云技术团队

背景 营销系统中&#xff0c;客户投诉是业务发展的一大阻碍&#xff0c;一般会过滤掉黑名单高风险账号&#xff0c;并配合频控策略&#xff0c;来减少客诉&#xff0c;进而增加营销效率&#xff0c;减少营销成本&#xff0c;提升营销质量。 营销系统一般是通过大数据分析建模…

Linux 驱动开发基础知识——APP 怎么读取按键值(十二)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;Vir2021GKBS &#x1f43c;本文由…

使用Dasviewer时怎样让分屏且全屏状态下,模型能持续转动?

答&#xff1a;轻微甩动下就可以旋转了&#xff0c;此外直接拖入打开模型也可以旋转。 DasViewer是由大势智慧自主研发的免费的实景三维模型浏览器,采用多细节层次模型逐步自适应加载技术,让用户在极低的电脑配置下,也能流畅的加载较大规模实景三维模型,提供方便快捷的数据浏览…

STL常用之vector,list,stack,queue,deque总结与对比

一&#xff0c;vector 1&#xff09;底层 vector的底层是开辟出来的一块连续空间&#xff0c;类似于数组&#xff0c;每次空间满了之后会根据不同的编译器有不同的扩容倍数。 2&#xff09;优劣 优点&#xff1a;随机访问效率高&#xff0c;因为地址是连续的&#xff0c;底层…