spring-boot-starter-validation常用注解

文章目录

  • 一、使用
  • 二、常用注解
  • 三、@Valid or @Validated ?
  • 四、分组校验
      • 1. 分组校验的基本概念
      • 2. 定义验证组
      • 3. 应用分组到模型
      • 4. 在控制器中使用分组
      • 5. 总结

一、使用

要使用这些注解,首先确保在你的 Spring Boot 应用的 pom.xml 文件中添加了 spring-boot-starter-validation 依赖。然后,你可以将这些注解应用于你的模型类字段上。在你的控制器方法中,你可以使用 @Valid@Validated 注解来触发验证,例如:

@PostMapping("/users")
public ResponseEntity<?> createUser(@Valid @RequestBody User user) {
    // 如果存在验证错误,会抛出异常
    // 正常业务逻辑
}

在这个例子中,如果 User 对象的字段不满足注解定义的验证规则,Spring 将抛出一个异常,你可以通过全局异常处理或控制器层的异常处理来处理这些异常,并向用户返回适当的响应。

二、常用注解

spring-boot-starter-validation 依赖包引入了 Java Bean Validation API(通常基于 Hibernate Validator 实现),提供了一系列注解来帮助你对 Java 对象进行验证。以下是一些常用的验证注解及其含义和使用方式:

  1. @NotNull: 确保字段不是 null

    public class User {
        @NotNull(message = "用户名不能为空")
        private String username;
        // 其他字段和方法
    }
    
  2. @NotEmpty: 确保字段既不是 null 也不是空(对于字符串意味着长度大于0,对于集合意味着至少包含一个元素)。

    public class User {
        @NotEmpty(message = "密码不能为空")
        private String password;
        // 其他字段和方法
    }
    
  3. @NotBlank: 确保字符串字段不是 null 且至少包含一个非空白字符。

    public class User {
        @NotBlank(message = "邮箱不能为空且不能只包含空格")
        private String email;
        // 其他字段和方法
    }
    
  4. @Size: 确保字段(字符串、集合、数组)符合指定的大小范围。

    public class User {
        @Size(min = 2, max = 30, message = "用户名长度必须在2到30之间")
        private String username;
        // 其他字段和方法
    }
    
  5. @Min@Max: 对数值类型字段设置最小值和最大值。

    public class User {
        @Min(value = 18, message = "年龄必须大于等于18")
        @Max(value = 100, message = "年龄必须小于等于100")
        private int age;
        // 其他字段和方法
    }
    
  6. @Email: 确保字段是有效的电子邮件地址。

    public class User {
        @Email(message = "无效的邮箱格式")
        private String email;
        // 其他字段和方法
    }
    
  7. @Pattern: 确保字符串字段匹配正则表达式。

    public class User {
        @Pattern(regexp = "^[a-zA-Z0-9]+$", message = "用户名只能包含字母和数字")
        private String username;
        // 其他字段和方法
    }
    
  8. @Positive@PositiveOrZero: 确保数值字段是正数或者正数和零。

    public class Product {
        @Positive(message = "价格必须是正数")
        private BigDecimal price;
        // 其他字段和方法
    }
    

三、@Valid or @Validated ?

@Valid@Validated 注解都用于数据验证,但它们在使用和功能上有一些差异:

  1. @Valid:

    • 来源于 JSR 303/JSR 380 Bean Validation API。
    • 可以用在方法参数上,以触发对传递给该方法的对象的验证。这通常在 Spring MVC 中用于验证带有 @RequestBody@ModelAttribute 注解的参数。
    • 不支持验证组的概念,这意味着不能控制验证的顺序或验证特定的子集。

    示例:

    @PostMapping("/users")
    public ResponseEntity<?> createUser(@Valid @RequestBody User user) {
        // 业务逻辑
    }
    
  2. @Validated(推荐):

    • 是 Spring 的特有注解,不是 JSR 303/JSR 380 的一部分。
    • 支持验证组,允许您更灵活地指定在特定情况下应用哪些验证约束。例如,可以根据不同的操作(如创建、更新)定义不同的验证规则。
    • 可以用在类型级别(在类上)和方法参数上。在类型级别使用时,它会触发该类中所有带有验证注解的方法的验证。

    示例:

    @PostMapping("/users")
    public ResponseEntity<?> createUser(@Validated @RequestBody User user) {
        // 业务逻辑
    }
    

在实际使用中,如果你需要简单的验证功能,@Valid 是一个很好的选择。如果你需要更复杂的验证逻辑,比如验证组,那么 @Validated 更适合。此外,@Validated 可以应用在类级别,从而对一个类的多个方法进行验证,这在使用 Spring 服务层时非常有用。

四、分组校验

分组校验(Group Validation)是一种在 Java Bean Validation 中用于在不同上下文中应用不同验证规则的方法。这对于那些在不同情况下(例如,创建 vs 更新)需要不同验证规则的对象特别有用。

1. 分组校验的基本概念

在分组校验中,你可以定义多个接口(通常为空)来表示不同的验证组。然后,你可以在验证注解中指定这些接口,以表明该注解仅在验证特定组时应用。

例如,你可能有一个User类,其中某些字段在创建用户时是必需的,但在更新用户时可能是可选的。

2. 定义验证组

首先,定义两个空接口作为验证组:

public interface OnCreate {}
public interface OnUpdate {}

3. 应用分组到模型

然后,在你的模型类中使用这些接口作为验证注解的参数:

public class User {

    @NotNull(groups = OnCreate.class)
    private Long id;

    @NotBlank(groups = {OnCreate.class, OnUpdate.class})
    private String username;

    @Email(groups = {OnCreate.class, OnUpdate.class})
    private String email;

    // 其他字段和方法
}

在这个例子中,id 字段仅在创建用户时需要验证(OnCreate组),而 usernameemail 字段在创建和更新用户时都需要验证。

4. 在控制器中使用分组

最后,在你的控制器方法中,使用 @Validated 注解指定要应用的验证组:

@PostMapping("/users")
public ResponseEntity<?> createUser(@Validated(OnCreate.class) @RequestBody User user) {
    // 创建用户的业务逻辑
}

@PutMapping("/users")
public ResponseEntity<?> updateUser(@Validated(OnUpdate.class) @RequestBody User user) {
    // 更新用户的业务逻辑
}

在这个例子中,createUser 方法只会验证属于 OnCreate 组的字段,而 updateUser 方法则只会验证属于 OnUpdate 组的字段。这样,你就可以根据不同的操作自定义验证逻辑了。

5. 总结

通过使用分组校验,你可以为同一个对象的不同操作设置不同的验证规则,这在复杂应用中非常有用。这种方法提高了代码的灵活性和可维护性。

在这里插入图片描述

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

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

相关文章

使用EtherNET转Profinet网关配置EtherNET/IP地址说明

EtherNET转Profinet网关配置EtherNET/IP地址是将两种网络之间的连接进行设置和调整&#xff0c;以便实现数据的传输和信息的交互。这个过程中&#xff0c;需要对EtherNET/IP地址进行配置&#xff0c;以确保数据能够正确地在网络之间传递。通过配置EtherNET/IP地址&#xff0c;可…

vue2(Vuex)、vue3(Pinia)、react(Redux)状态管理

vue2状态管理Vuex Vuex 是一个专为 Vue.js应用程序开发的状态管理模式。它使用集中式存储管理应用的所有组件的状态&#xff0c;以及规则保证状态只能按照规定的方式进行修改。 State&#xff08;状态&#xff09;:Vuex 使用单一状态树&#xff0c;即一个对象包含全部的应用层…

sql管理工具archery简介

在平时的工作过程中&#xff0c;我们肯定会遇到使用sql平台的场景&#xff0c;业内也有很多工具&#xff0c;类似阿里云的dms&#xff0c;但是这个是和云厂商绑定的&#xff0c;我们可能一般没有用到阿里云组件就比较困难了&#xff0c;那还有什么选项了&#xff0c;经过调研&a…

JVM简介

一、什么是JVM JVM是Java Virtual Machine&#xff08;Java虚拟机&#xff09;的缩写&#xff0c;JVM是一种用于计算设备的规范&#xff0c;它是一个虚构出来的计算机&#xff0c;是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组…

YOLOv5全网独家首发:Powerful-IoU更好、更快的收敛IoU,效果秒杀CIoU、GIoU等 | 2024年最新IoU

💡💡💡本文独家改进:Powerful-IoU更好、更快的收敛IoU,是一种结合了目标尺寸自适应惩罚因子和基于锚框质量的梯度调节函数的损失函数 💡💡💡MS COCO和PASCAL VOC数据集实现涨点 收录 YOLOv5原创自研 https://blog.csdn.net/m0_63774211/category_1251193…

哪些 3D 建模软件值得推荐?

云端地球是一款免费的在线实景三维建模软件&#xff0c;不需要复杂的技巧&#xff0c;只要需要手机&#xff0c;多拍几张照片&#xff0c;就可以得到完整的三维模型&#xff01; 无论是大场景倾斜摄影测量还是小场景、小物体建模&#xff0c;都可以通过云端地球将二维数据向三…

C++哈希表模拟实现unordered_map 与unordered_set

哈希概念 unordered系列的关联式容器&#xff08;如unordered_map unordered_set&#xff09; 之所以效率比较高&#xff0c;是因为其底层使用了哈希结构 顺序结构以及平衡树 中&#xff0c;元素关键码与其存储位置之间没有对应的关系&#xff0c;因此在 查找一个元素 时&am…

php二次开发股票系统代码:腾讯股票数据接口地址、批量获取股票信息、转换为腾讯接口指定的股票格式

1、腾讯股票数据控制器 <?php namespace app\index\controller;use think\Model; use think\Db;const BASE_URL http://aaaaaa.aaaaa.com; //腾讯数据地址class TencentStocks extends Home { //里面具体的方法 }2、请求接口返回内容 function juhecurl($url, $params f…

Linux/Uinx 系统编程:进程管理(1)

Linux/Uinx 系统编程&#xff1a;进程管理&#xff08;1&#xff09; 文章目录 Linux/Uinx 系统编程&#xff1a;进程管理&#xff08;1&#xff09;什么是进程进程来源INIT 和 守护进程登录进程sh进程进程的执行模式进程管理的系统调用关于syscall中参数b&#xff0c;c&#x…

HCIP 三层交换

拓扑图&IP划分如下&#xff1a; 第一步&#xff0c;配置IP 以R1为例&#xff0c;R2同理 LSW1&#xff0c;LSW2同理 第二步&#xff0c;聚合链路 LSW1&#xff0c;LSW2同理 修改串口 LSW1&#xff0c;LSW2同理 第三步&#xff0c;配置生成树 LSW1&#xff0c;LSW2同理 …

听力下降为什么会影响到言语感知?

一、听力障碍对阈值、听觉频率范围和分辨能力的影响 听力障碍使得听障者的听敏度降低&#xff0c;提高了阈值&#xff0c;不利于言语信号的接收。听障者听力阈值的变化在不同频率并不相同&#xff0c;一般而言&#xff0c;高频部分的听力损失往往大于低频部分&#xff0c;而言…

代码随想录刷题笔记-Day11

1. 逆波兰表达式求值 150. 逆波兰表达式求值https://leetcode.cn/problems/evaluate-reverse-polish-notation/description/ 给你一个字符串数组 tokens &#xff0c;表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 注意&a…

区块链技术在教育领域的应用:Web3教育变革

随着Web3时代的来临&#xff0c;区块链技术在各个领域都展现出了巨大的潜力&#xff0c;而在教育领域&#xff0c;区块链的应用正引领着一场教育变革。本文将深入探讨区块链技术在教育领域的创新应用&#xff0c;以及这一应用如何推动Web3时代的教育变革。 1. 学历和成绩的去中…

Shell脚本⑤函数与数组

一.函数 封装的可重复利用的具有特定功能的代码 格式&#xff1a; 方法一&#xff1a; [function] 函数名 (){ 命令序列 [return x] #使用return或者exit可以显式的结束函数 } 方法二&#xff1a; 函数名(){ 命令序列 } 1.函数的调用方法 &#xff08;1&…

【K8S 云原生】K8S的安全机制

目录 一、K8S安全机制概述 1、概念 2、请求apiserver资源的三个步骤&#xff1a; 一、认证&#xff1a;Anthentcation 1、认证的方式&#xff1a; 1、HTTP TOKEN&#xff1a; 2、http base&#xff1a; 3、http证书&#xff1a; 2、认证的访问类型&#xff1a; 3、签发…

【Power Platform】实现让审批人可以修改其他人提交的表单中的部分字段

之前我们分享的案例里&#xff0c;我提了一嘴我们的客户有一个需求&#xff0c;就是审批人要有能力修改其他人表单中的部分字段。 今天我们就来分享一下如何实现这个功能。 要实现这个效果&#xff0c;我们需要判断三个值——当前审批人是不是当前登录人、当前审批节点可以修…

基于python京东商品数据采集与可视化分析大屏设计与实现

随着电子商务行业的快速发展&#xff0c;京东作为中国最大的综合性电商平台之一&#xff0c;拥有海量的商品数据。对这些数据进行采集与分析&#xff0c;能够帮助企业了解市场趋势、消费者需求以及产品销售情况&#xff0c;为决策提供科学依据。 本文旨在基于京东商品数据的采…

Linux设备树中的 gpio 信息

一. 简介 前面几篇文章讲解了 pinctrl 子系统&#xff0c; pinctrl 子系统重点是设置 PIN( 有的 SOC 叫做 PAD) 的复用 和电气属性。 注意&#xff1a;如果 pinctrl 子系统将一个 PIN 复用为 GPIO 的话&#xff0c;那么接下来就要用到 gpio 子系统了。如果 PIN用作其他…

若依微服务框架 上传文件(文件表)

若依微服务得上传文件只有在头像那里才有&#xff0c;而且存储得是地址。 如果想要进行文件表存储&#xff0c;只能自己进行封装。 若依微服务框架 上传文件&#xff08;文件表&#xff09; 一、问题二、代码1.组件代码2、调用 一、问题 若依在上传文件这里使用了watch监听&a…

Webpack5 基本使用 - 1

Webpack 是什么 webpack 的核心目的是打包&#xff0c;即把源代码一个一个的 js 文件&#xff0c;打包汇总为一个总文件 bundle.js。 基本配置包括mode指定打包模式&#xff0c;entry指定打包入口&#xff0c;output指定打包输出目录。 另外&#xff0c;由于 webpack默认只能打…
最新文章