活到老学到老-Spring参数校验注解Validated /Valid

通过 @Validated 和 @Valid可以对请求的进行参数校验。

1.核心对比:

特性@Valid (JSR-303)@Validated (Spring)
来源Java标准规范Spring框架扩展
分组校验不支持支持(通过groups属性)
嵌套路径自动处理级联校验需配合@Valid生效
应用范围方法参数、属性、返回值类、方法、参数
List校验需放在集合声明处需配合@Valid生效

2.基础使用示例

 2.1 单对象校验

public class UserDTO {@NotBlank(message = "用户名不能为空")private String username;@Email(message = "邮箱格式错误")private String email;
}// 使用@Valid
@PostMapping("/users")
public Result createUser(@RequestBody @Valid UserDTO user) {// ...
}// 使用@Validated
@RestController
@Validated // 类级别启用校验
public class UserController {@PostMapping("/users")public Result createUser(@RequestBody @Validated UserDTO user) {// ...}
}

3. 级联属性校验

3.1 嵌套对象校验
public class OrderDTO {@NotNullprivate Long orderId;@Valid // 关键注解,启用嵌套校验private UserDTO user;
}// 测试
@PostMapping("/orders")
public Result createOrder(@RequestBody @Valid OrderDTO order) {// 会自动校验order.user里的约束
}
3.2 集合元素校验
public class BatchRequest {@Size(min = 1, max = 10)private List<@Valid UserDTO> users; // 校验每个元素
}@PostMapping("/batch")
public Result batchCreate(@RequestBody @Valid BatchRequest request) {// 会校验list内每个UserDTO
}

4. 分组校验(仅@Validated支持)

4.1 定义校验分组
public interface CreateCheck {}
public interface UpdateCheck {}public class ProductDTO {@Null(groups = CreateCheck.class) // 创建时ID必须为空@NotNull(groups = UpdateCheck.class) // 更新时ID不能为空private Long id;@NotBlank(groups = {CreateCheck.class, UpdateCheck.class})private String name;
}
4.2 使用分组
@PostMapping("/products")
public Result create(@RequestBody @Validated(CreateCheck.class) ProductDTO product) {// 仅触发CreateCheck组的校验
}@PutMapping("/products/{id}")
public Result update(@PathVariable Long id, @RequestBody @Validated(UpdateCheck.class) ProductDTO product) {// 仅触发UpdateCheck组的校验
}

5.统一异常处理

@RestControllerAdvice
public class GlobalExceptionHandler {// 处理@Validated和@Valid抛出的异常@ExceptionHandler(MethodArgumentNotValidException.class)public Result handleValidException(MethodArgumentNotValidException e) {List<String> errors = e.getBindingResult().getFieldErrors().stream().map(error -> error.getField() + ": " + error.getDefaultMessage()).collect(Collectors.toList());return Result.fail(400, "参数错误", errors);}
}

6.最佳实现

6.1 混合使用
类/方法级用 @Validated参数/属性级用 @Valid
6.2 性能优化
// 避免在循环中校验
@Validated
@Service
public class UserService {public void batchProcess(@Valid List<UserDTO> users) {// 批量处理}
}
6.3 自定义校验
@Target({FIELD})
@Retention(RUNTIME)
@Constraint(validatedBy = PhoneValidator.class)
public @interface Phone {String message() default "手机号格式错误";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};
}
6.4 复杂场景
// 级联校验+集合校验
public class DepartmentDTO {@Validprivate List<@Valid EmployeeDTO> employees;@Validprivate AddressDTO location;
}

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

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

相关文章

【笔记】JetBrains 数据迁移与符号链接操作

数据迁移与符号链接操作 一、备份原始数据 使用 robocopy 命令备份 C 盘中的源文件夹&#xff0c;确保原始数据完整备份。 robocopy "C:\Users\love\AppData\Local\JetBrains" "E:\Downloads\Other\JetBrains" /E确保备份路径足够存储空间。 二、复制文…

使用 Terraform 创建 Azure Databricks 工作区

使用 Terraform 创建 Azure Databricks Terraform 是一种基础设施即代码(IaC)工具,允许用户通过声明式配置文件来管理和部署云资源。Azure Databricks 是一个基于 Apache Spark 的分析平台,专为数据工程和数据科学设计。通过 Terraform,可以自动化 Azure Databricks 的创…

【zookeeper】--部署3.6.3

文章目录 下载解压创建data和logs配置文件1)创建目录并且编辑 zoo.cfg2)接下来将 node01 的 ZooKeeper 所有文件拷贝至 node02 和 node03。推荐从 node02 和 node03 拷贝4&#xff09;最后 vim /etc/profile 配置环境变量&#xff0c;环境搭建结束。配完环境变量后 source /etc…

RxJS 核心操作符详细用法示例

1. Observable 详细用法 Observable 是 RxJS 的核心概念&#xff0c;代表一个可观察的数据流。 创建和订阅 Observable import { Observable } from "rxjs";// 1. 创建Observable const myObservable new Observable(subscriber > {// 发出三个值subscriber.n…

QGrphicsScen画布网格和QGrphicsItem对齐到网格

#include <QGraphicsScene> #include <QPainter> #include <QWheelEvent> #include <QGraphicsView> class MyGraphicsView : public QGraphicsView { public:MyGraphicsView(QGraphicsScene* scene) : QGraphicsView(scene){}protected:// 重写滚轮事…

深入解析自然语言处理中的语言转换方法

在数字化浪潮席卷全球的今天&#xff0c;自然语言处理&#xff08;Natural Language Processing&#xff0c;NLP&#xff09;作为人工智能领域的核心技术之一&#xff0c;正深刻地改变着我们与机器交互的方式。其中&#xff0c;语言转换方法更是 NLP 的关键组成部分&#xff0c…

VRRP虚拟路由器协议的基本概述

目录 vrrp是什么&#xff1f; VRRP的一些概念与专有名词 VRRP的Master选举规则&#xff1a; 尾声 vrrp是什么&#xff1f; vrrp全名virtual router redundance protocol&#xff0c;虚拟路由器冗余协议 VRRP的一些概念与专有名词 1&#xff09;VRRP设备&#xff1a;运行VRRP…

数据结构 -- 交换排序(冒泡排序和快速排序)

冒泡排序 基于“交换”的排序&#xff1a;根据序列中两个元素关键字的比较结果来对换这两个记录在序列中的位置 //交换 void swap(int &a,int &b){int temp a;a b;b temp; }//冒泡排序 void BubbleSort(int A[],int n){for(int i0;i<n-1;i){bool flag false; …

多模态AI终极形态?GPT-5与Stable Diffusion 3的融合实验报告

多模态AI终极形态&#xff1f;GPT-5与Stable Diffusion 3的融合实验报告 系统化学习人工智能网站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目录 多模态AI终极形态&#xff1f;GPT-5与Stable Diffusion 3的融合实验报告摘要引言技术架构对…

ajax中get和post的区别,datatype返回的数据类型有哪些?

GET 请求 和 POST 请求 是 HTTP 协议中常用的两种请求方法&#xff0c;它们主要的区别在于&#xff1a; GET 请求&#xff1a; 数据传输方式&#xff1a;数据通过 URL 传递&#xff0c;通常是附加在 URL 后面的查询字符串中&#xff0c;例如 https://example.com/page?nameJoh…

101 alpha_59

(0 - (1 * (rank((sum(returns, 10) / sum(sum(returns, 2), 3))) * rank((returns * cap))))) 0 - (1 * A * B) A rank((sum(returns, 10) / sum(sum(returns, 2), 3)))B rank((returns * cap)) sum(returns, 10)&#xff1a;计算过去 10 期收益率的总和sum(returns, 2)&…

vscode里几种程序调试配置

标题调试python嵌入的c代码,例如 import torch from torch.utils.cpp_extension import loadtest_load load(nametest_load, sources[test.cpp],extra_cflags[-O0, -g],#extra_cflags[-O1],verboseTrue, ) a torch.tensor([1, 2, 3]) b torch.tensor([4, 5, 6]) result te…

深入解析MySQL中的HAVING关键字:从入门到实战

引言 在SQL查询中&#xff0c;数据过滤是核心操作之一。我们常用WHERE子句进行行级过滤&#xff0c;但当需要对分组后的结果进行条件筛选时&#xff0c;HAVING关键字便成为不可或缺的工具。本文将深入探讨HAVING的作用、使用场景及其与WHERE的区别&#xff0c;并通过实际案例帮…

根据YOLO数据集标签计算检测框内目标面积占比(YOLO7-10都适用)

程序&#xff1a; 路径改成自己的&#xff0c;阈值可以修改也可以默认 #zhouzhichao #25年5月17日 #计算时频图中信号面积占检测框面积的比值import os import numpy as np import pandas as pd from PIL import Image# Define the path to the directory containing the lab…

AI神经网络降噪 vs 传统单/双麦克风降噪的核心优势对比

1. 降噪原理的本质差异 对比维度传统单/双麦克风降噪AI神经网络降噪技术基础基于固定规则的信号处理&#xff08;如谱减法、维纳滤波&#xff09;基于深度学习的动态建模&#xff08;DNN/CNN/Transformer&#xff09;噪声样本依赖预设有限噪声类型训练数据覆盖数十万种真实环境…

了解Android studio 初学者零基础推荐(3)

kotlin中的数据类及对象 使用泛型创建可重复使用的类 我们将常在线答题考试&#xff0c;有的考试题型包括判断&#xff0c;或者填空&#xff0c;以及数学题&#xff0c;此外试题内容还包括难易程度&#xff1a;"easy”,"medium"&#xff0c;"hard",…

【占融数科-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

记录一次请求数据很慢的灾难

起因&#xff1a; 因公司业务需要&#xff0c;对接了一个平台的 api。对接完成之后&#xff0c;发现只要打开开关&#xff0c;就别的接口就访问很慢&#xff0c;出现 gatway time out。 排查&#xff1a; 先看下主服务器和 slave 服务器的状态&#xff1a; 主服务&#xff…

力扣-将x减到0的最小操作数

1.题目描述 2.题目链接 1658. 将 x 减到 0 的最小操作数 - 力扣&#xff08;LeetCode&#xff09; 3.题目分析 1&#xff09;正面求解困难 题目要求我们每次都从最左边或者最右边取一个数&#xff0c;使x-元素的值&#xff0c;并在数组中移除该元素。最后返回的最小操作数…

排序复习/上(C语言版)

目录 1.排序概念 2.冒泡排序 效率性能测试代码&#xff1a; 性能分析&#xff1a; 3.直接插入排序 单趟&#xff1a; 整体&#xff1a; 性能分析&#xff1a; 4.希尔排序&#xff08;基于插入排序的优化&#xff09; 单趟单组&#xff1a; 单趟多组&#xff1a; 降低…