spring boot中@Validated

在 Spring Boot 中,@Validated 是用于触发参数校验的注解,通常与 ​​JSR-303/JSR-380​​(Bean Validation)提供的校验注解一起使用。以下是常见的校验注解及其用法:

​1. 基本校验注解​​

这些注解可以直接用于字段、方法参数或方法返回值,结合 @Validated 进行校验。

注解作用示例
@NotNull不能为 null@NotNull(message = “用户名不能为空”)
@NotEmpty不能为 null 且不能为空(适用于 String、Collection、Map、Array)@NotEmpty(message = “列表不能为空”)
@NotBlank不能为 null 且 trim() 后长度 > 0(仅适用于 String)@NotBlank(message = “姓名不能为空”)
@Null必须为 null@Null(message = “ID 不能存在”)
@AssertTrue必须为 true@AssertTrue(message = “必须同意协议”)
@AssertFalse必须为 false@AssertFalse(message = “不能启用”)
@Past必须是过去的时间(Date、LocalDateTime 等)@Past(message = “出生日期必须是过去”)
@Future必须是未来的时间@Future(message = “截止时间必须是未来”)
@Pattern(regex)必须匹配正则表达式@Pattern(regexp = "^[a-zA-Z0-9]+$", message = "只能包含字母和数字")
@Size(min, max)字符串/集合/数组的长度范围@Size(min = 2, max = 10, message = “长度必须在 2-10 之间”)
@Length(min, max)(Hibernate Validator 扩展)同 @Size@Length(min = 2, max = 10)
@Min(value)最小值(适用于 Number)@Min(1, message = “年龄不能小于 1”)
@Max(value)最大值(适用于 Number)@Max(120, message = “年龄不能超过 120”)
@DecimalMin(value)最小值(适用于 BigDecimal)@DecimalMin(“0.01”, message = “金额不能小于 0.01”)
@DecimalMax(value)最大值(适用于 BigDecimal)@DecimalMax(“999999.99”)
@Digits(integer, fraction)数字精度(整数位和小数位)@Digits(integer = 5, fraction = 2, message = “最多 5 位整数,2 位小数”)
@Email必须是有效的邮箱格式@Email(message = “邮箱格式不正确”)

​​2. 分组校验(groups)​​

可以定义不同的校验规则,并在特定场景下使用:

public class User {@NotNull(groups = {Create.class, Update.class}, message = "ID 不能为空")@Null(groups = {Delete.class}, message = "删除时不能传 ID")private Long id;@NotBlank(groups = Create.class, message = "创建时用户名不能为空")private String username;public interface Create {}public interface Update {}public interface Delete {}
}

​​Controller 使用分组校验​​:

@PostMapping("/create")
public String create(@Validated(User.Create.class) @RequestBody User user) {// 只校验 Create 分组的规则return "Created";
}@PutMapping("/update")
public String update(@Validated(User.Update.class) @RequestBody User user) {// 只校验 Update 分组的规则return "Updated";
}

​​3. 嵌套对象校验(@Valid)​​

如果对象包含嵌套对象,需要用 @Valid 触发嵌套校验:

public class Order {@NotNullprivate Long id;@Valid  // 触发嵌套校验@NotNullprivate User user;  // User 类也需要校验注解
}

​​Controller 使用​​:

@PostMapping("/order")
public String createOrder(@Validated @RequestBody Order order) {// 会校验 Order 和 User 的所有校验规则return "Order created";
}

​​4. 自定义校验注解​​

如果内置注解不满足需求,可以自定义校验注解:
​​示例:校验 Integer 是否是 0 或 1​​

1. 定义注解 @OneOrZero​​

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = OneOrZeroValidator.class)
public @interface OneOrZero {String message() default "值必须是 0 或 1";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};
}

2. 实现校验逻辑 OneOrZeroValidator​​

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;public class OneOrZeroValidator implements ConstraintValidator<OneOrZero, Integer> {@Overridepublic boolean isValid(Integer value, ConstraintValidatorContext context) {return value == null || (value == 0 || value == 1);}
}

​​3. 在实体类中使用​​

public class MyRequest {@OneOrZero(message = "状态必须是 0 或 1")private Integer status;
}

​​5. 全局异常处理(@ControllerAdvice)​​

当校验失败时,Spring 会抛出 MethodArgumentNotValidException,可以通过 @ControllerAdvice 统一处理:

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;import java.util.HashMap;
import java.util.Map;@RestControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(MethodArgumentNotValidException.class)public ResponseEntity<Map<String, String>> handleValidationExceptions(MethodArgumentNotValidException ex) {Map<String, String> errors = new HashMap<>();ex.getBindingResult().getFieldErrors().forEach(error -> errors.put(error.getField(), error.getDefaultMessage()));return new ResponseEntity<>(errors, HttpStatus.BAD_REQUEST);}
}

​​返回示例​​:

{"username": "用户名不能为空","email": "邮箱格式不正确"
}

​​6. 常见问题​​

​​Q1: @Valid 和 @Validated 的区别?​​

注解作用适用场景
@Valid触发 JSR-303 校验一般用于嵌套对象校验(如 @Valid User user)
@ValidatedSpring 提供的增强版,支持分组校验一般用于 Controller 方法参数校验

​​Q2: 为什么 @Validated 不生效?​​

  • 检查是否在 ​​Controller 类或方法参数​​ 上使用了 @Validated。
  • 确保依赖正确(Spring Boot 默认包含 spring-boot-starter-validation)。
  • 如果校验的是 List 或 Map,确保使用 @Valid 嵌套校验:
    public class Request {@Valid  // 必须加 @Validprivate List<User> users;}

7. ​​总结​​

场景推荐注解
基本校验@NotNull, @NotEmpty, @Pattern, @Size
分组校验groups + @Validated
嵌套校验@Valid
自定义校验@Constraint + ConstraintValidator
全局异常处理@ControllerAdvice

通过合理使用这些注解,可以轻松实现参数校验,提高代码健壮性! 🚀

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

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

相关文章

Hadoop 单机模式(Standalone Mode)部署与 WordCount 测试

通过本次实验&#xff0c;成功搭建了 Hadoop 单机环境并运行了基础 MapReduce 程序&#xff0c;为后续分布式计算学习奠定了基础。 掌握 Hadoop 单机模式的安装与配置方法。 熟悉 Hadoop 环境变量的配置及 Java 依赖管理。 使用 Hadoop 自带的 WordCount 示例程序进行简单的 …

历史数据分析——运输服务

运输服务板块简介: 运输服务板块主要是为货物与人员流动提供核心服务的企业的集合,涵盖铁路、公路、航空、海运、物流等细分领域。该板块具有强周期属性,与经济复苏、政策调控、供需关系密切关联,尤其是海运领域。有不少国内股市的铁路、公路等相关的上市公司同时属于红利…

openEuler 22.03 安装 Mysql 5.7,TAR离线安装

目录 一、检查系统是否安装其他版本Mariadb数据库二、环境检查2.1 必要环境检查2.2 在线安装&#xff08;有网络&#xff09;2.3 离线安装&#xff08;无网络&#xff09; 三、下载Mysql2.1 在线下载2.2 离线下载 四、安装Mysql五、配置Mysql六、开放防火墙端口七、数据备份八、…

喷泉码技术在现代物联网中的应用 设计

喷泉码技术在现代物联网中的应用 摘 要 喷泉码作为一种无速率编码技术,凭借其动态生成编码包的特性,在物联网通信中展现出独特的优势。其核心思想在于接收端只需接收到足够数量的任意编码包即可恢复原始数据,这种特性使其特别适用于动态信道和多用户场景。喷泉码的实现主要…

GZIPInputStream 类详解

GZIPInputStream 类详解 GZIPInputStream 是 Java 中用于解压缩 GZIP 格式数据的流类,属于 java.util.zip 包。它是 InflaterInputStream 的子类,专门处理 GZIP 压缩格式(.gz 文件)。 1. 核心功能 解压 GZIP 格式数据(RFC 1952 标准)自动处理 GZIP 头尾信息(校验和、时…

网络编程——TCP和UDP详细讲解

文章目录 TCP/UDP全面详解什么是TCP和UDP&#xff1f;TCP如何保证可靠性&#xff1f;1. 序列号&#xff08;Sequence Number&#xff09;2. 确认应答&#xff08;ACK&#xff09;3. 超时重传&#xff08;Timeout Retransmission&#xff09;4. 窗口控制&#xff08;Sliding Win…

性能测试工具篇

文章目录 目录1. JMeter介绍1.1 安装JMeter1.2 打开JMeter1.3 JMeter基础配置1.4 JMeter基本使用流程1.5 JMeter元件作用域和执行顺序 2. 重点组件2.1 线程组2.2 HTTP取样器2.3 查看结果树2.4 HTTP请求默认值2.5 JSON提取器2.6 用户定义的变量2.7 JSON断言2.8 同步定时器&#…

rabbitMQ如何确保消息不会丢失

rabbitmq消息丢失的三种情况 生产者将消息发送到RabbitMQ的过程中时&#xff0c;消息丢失。消息发送到RabbitMQ&#xff0c;还未被持久化就丢失了数据。消费者接收到消息&#xff0c;还未处理&#xff0c;比如服务宕机导致消息丢失。 解决方案 生产者发送过程中&#xff0c;…

Beetle-RP2350 扩展板设计

Beetle-RP2350 扩展板设计 本文介绍了 DFRobot Beetle RP2350 开发板的扩展板设计&#xff0c;包括参数特点、效果展示、原理图、实物验证、工程测试等&#xff0c;为 RP2350 系列产品的开发提供了便捷。 PCB 工程详见&#xff1a;Beetle-RP2350扩展板 - 立创开源硬件平台 . …

2025年一加7pro刷twpr / magisk / kali nethunter教程+资源下载+避坑指南

从二手市场500淘了一个一加7pro 12+256 ,根据网上教程刷机但很多坑,折腾一周后搞定,记录下给后人避坑 资源下载:链接:https://pan.quark.cn/s/c16b972509f2 提取码:mUW7 本文是主流程+避坑指南,没有基础的需要手把手教学的shell都不会的就别看了,直接放弃或者tb找人花钱…

java HashMap,高效 哈希

java HashMap 有独特的设计。 哈希表数组的每个位置是一个哈希桶&#xff0c;里面由链表或红黑树实现。&#xff08;> 8 或 < 6 的变化时&#xff0c;避免频繁切换&#xff09; 容量&#xff08;capacity&#xff09;&#xff1a; 哈希表中桶&#xff08;bucket&#xf…

【业务领域】计算机网络基础知识

《计算机网络方面有哪些书籍值得推荐&#xff1f;》 知乎扫盲贴&#xff1a; 《网络是怎么链接的》 初识RDMA技术——RDMA概念&#xff0c;特点&#xff0c;协议&#xff0c;通信流程 采样 》 存储 》传输 》处理 》反应 传感器 存储器 接口 算法/cpu 机器

List--链表

一、链表 1.1 什么是List&#xff1f; 在C语言中&#xff0c;我们需要使用结构体struct来进行List(链表&#xff09;的实现&#xff1a; struct ListNode {DataType Data;//DataType是任意类型的变量定义struct ListNode* next;//指向下一个结点的指针变量 }; 与之前的vect…

tensor 的计算操作

1、创建tensor 常见创建 tensor 的方法 函数 作用 torch.Tensor(*size) 通过指定尺寸&#xff0c;生成一个 值全为 0 的 tensor torch.tensor(*list) 直接通过指定数据&#xff0c;生成tensor&#xff0c;支持 List、Numpy数组 torch.eye(row, column) 按照指定的行列数…

【Java面试题04】MySQL 篇

文章目录 一、前言&#x1f680;&#x1f680;&#x1f680;二、MySQL 篇&#xff1a;☀️☀️☀️1、MySQL 是如何实现事务的? 后序还在更新中~~~三、总结&#xff1a;&#x1f353;&#x1f353;&#x1f353; 一、前言&#x1f680;&#x1f680;&#x1f680; ☀️ 你每一…

UDP/TCP协议知识及相关机制

一.UDP协议 UDP是一种无连接、不可靠、面向报文、全双工传输层的协议~ 1.无连接 &#xff1a; 知道对端的端口号和IP可以直接传输&#xff0c;不需要建立连接 2..不可靠&#xff1a;没有确认机制&#xff0c;没有重传机制&#xff0c;不知道数据包能否能正确到达对端&#xff0…

【AI面试准备】语言模型、语音、多模态等模型能力评估指标和能力边界

面试岗位提出这个要求:掌握语言模型、语音、多模态等模型能力评估指标和能力边界。 以下是针对语言模型、语音模型、多模态模型能力评估指标与能力边界的结构化总结,结合高频面试考点和实际应用场景: 目录 **一、语言模型(LLM)评估与边界**1. **核心评估指标**2. **能力边…

优雅关闭服务:深入理解 SIGINT / SIGTERM 信号处理机制

目录 为什么需要优雅关闭&#xff1f; 什么是 SIGINT 和 SIGTERM&#xff1f; 如何实现优雅关闭&#xff08;以 C 为例&#xff09; 示例代码&#xff08;gRPC 服务 Boost 信号监听&#xff09;&#xff1a; 优雅关闭时的清理内容通常包括&#xff1a; 与 SIGKILL 的区别…

容器化-Docker-集群

一、Docker 集群基础概念​ 1、什么是 Docker 集群​ Docker 集群是由多个 Docker 主机组成的集合,这些主机通过网络连接在一起,共同管理和运行容器。在集群中,我们可以将容器服务均匀地分布到各个节点上,实现负载均衡和资源的高效利用。Docker 集群的核心组件包括管理器…

关于kafka

1.为什么需要消息队列 举个经典的例子。 你是一个网购达人&#xff0c;经常在网上购物。快递小哥到了你的小区后&#xff0c;立刻给你打电话说&#xff1a;“你的快递到了&#xff0c;请马上来取。” 但你是一个合格的牛马&#xff0c;在上班&#xff0c;不方便取快递&#…