当前位置: 首页 > news >正文

@Valid和@Vlidated的区别

@Valid 和 @Validated 注解的对比总结

1. 依赖关系

注解

依赖库/框架

额外配置要求

@Valid

JSR-380 (Bean Validation API)

仅需引入 javax.validation

或 Jakarta 规范实现(如 Hibernate Validator)

@Validated

Spring Framework

需 Spring Context 支持(通常通过 spring-boot-starter-validation

隐式引入)

2. 多种用法
@Valid 的典型场景
  • Controller 层参数校验(最常用):
java@PostMapping("/login")
public Result<String> login(@Valid @RequestBody LoginDTO loginDTO) {// 自动校验 LoginDTO 字段
}
    • 触发条件:仅需在参数上添加 @Valid,Spring MVC 通过 RequestResponseBodyMethodProcessor 自动处理校验。
  • 嵌套对象校验
javapublic class OrderDTO {@Validprivate UserDTO user; // 嵌套校验 UserDTO 的字段
}
@Validated 的典型场景
  • Service 层方法校验
java@Service
@Validated // 必须添加在类上
public class UserService {public void createUser(@Valid UserDTO userDTO) {// 自动校验 UserDTO}
}
  • 分组校验
javapublic interface UpdateGroup {}@Data
public class UserDTO {@NotNull(groups = UpdateGroup.class)private Long id;
}@RestController
@Validated // 必须添加在类上
public class UserController {@PutMappingpublic Result<?> update(@Validated(UpdateGroup.class) UserDTO dto) {// 仅校验 UpdateGroup 分组的规则}
}
  • 自定义校验逻辑(如 AOP)
java@Service
@Validated
public class OrderService {@CustomCheck // 自定义校验注解public void processOrder(OrderDTO order) {// 自定义校验逻辑通过 AOP 触发}
}
3. 核心区别

特性

@Valid

@Validated

作用层级

字段/方法参数级别(JSR-380 标准)

类/方法级别(Spring 扩展)

触发场景

显式注解即可触发

需在类/方法上声明

分组校验

❌ 不支持

✅ 支持(需配合 groups

属性)

嵌套校验

✅ 支持

✅ 支持

依赖要求

仅需 Bean Validation API

需 Spring Context 支持

Service 层使用

❌ 无法直接触发

✅ 必须通过 @Validated

注解类

自定义校验

❌ 需手动实现

✅ 支持(通过 AOP 或方法拦截)

4. 最佳实践
  • Controller 层
    • @RequestBody 参数使用 @Valid,无需添加 @Validated
    • 示例:
java@PostMapping("/login")
public Result<String> login(@Valid @RequestBody LoginDTO loginDTO) {// ...
}
  • Service 层
    • 如果需要校验方法参数,必须在类上添加 @Validated
    • 示例:
java@Service
@Validated
public class UserService {public void createUser(@Valid UserDTO userDTO) {// ...}
}
  • 分组校验
    • 必须使用 @Validated 并指定分组类。
    • 示例:
java@PutMapping
public Result<?> update(@Validated(UpdateGroup.class) UserDTO dto) {}
5. 验证流程对比

场景

触发校验的关键因素

@RequestBody + @Valid

Spring MVC 内置处理器自动触发

Service 层方法

@Validated

注解类 + @Valid

参数

分组校验

@Validated(group)

+ @Valid

参数

总结

  • @Valid 是 JSR-380 标准注解,轻量级且跨框架,适用于 Controller 层参数校验和嵌套对象校验。
  • @Validated 是 Spring 扩展注解,提供分组校验、Service 层校验和自定义校验逻辑等高级功能,需与 Spring 容器配合使用。
  • 根据场景选择:Controller 层用 @Valid,Service 层或复杂校验用 @Validated
http://www.dtcms.com/a/213074.html

相关文章:

  • JAVA集合(含List、Map、Set)(超详细版)
  • Mujoco 学习系列(六)官方教程 The introductory tutorial teaches MuJoCo basics
  • Java集合使用中的常见错误与最佳实践
  • Disruptor—3.核心源码实现分析一
  • 国际荐酒师(香港)协会亮相新西兰葡萄酒巡展深度参与赵凤仪大师班
  • 初识消息队列
  • DAY35
  • leetcode654.最大二叉树:递归分治下的最大值索引定位与树构建
  • QStandardItem的函数介绍
  • 2025第三届黄河流域网络安全技能挑战赛--Crypto--WriteUp
  • 服务器线上问题解决方案
  • Redis持久化之RDB
  • OSCP备战-mr-robot靶机详细解法
  • docker问题记录
  • 2025/5/25 学习日记 linux进阶命令学习
  • 有限时间 vs 固定时间 vs 预定时间滑模:稳定性分析与仿真验证方法对比(下)
  • 基于diffusion的图像编辑与inpaint
  • mysql数据库之备份
  • 【PhysUnits】13 减法操作(sub.rs)
  • 右键管理工具,让你电脑实用更加顺滑!
  • 第11次课 while循环
  • 第三方检测机构如何凭借专业公正保障软件质量?资质有哪些?
  • 深入解析Java组合模式:构建灵活树形结构的艺术
  • PostgreSQL windows安装
  • 【AI Study】第三天,Python基础 - 同NumPy类似的类库
  • Global Securities Markets 第二章知识点总结
  • 英语六级-阅读篇
  • 嵌入式学习 D27:系统编程--进程
  • ind_knn_ad环境搭建和运行【用自己的数据集】
  • MySQL(36)如何使用CASE进行条件表达式?