@Valid 和 @Validated 两个数据校验的关键注解的区别和使用

常用校验注解@NotEmpty,@NotBlank,@NotNull,@Valid,@Validated用法区别,以及搭配 BindingResult使用,嵌套验证等《使用|优快云创作打卡》 文章目录一、常用注解@NotEmpty,@NotBlank,@NotNull介绍二、@Valid与@Validated的使用与区别2.1@Valid与@Validated区别:2.2嵌套验证三、总结 一、常用注解@NotEmpty,@NotBlank,@NotNull介绍 包位置:javax.validation.constraints.xxx @NotEmpty 用在集合上面,一般用来校验List类型(不能注释枚举),而且长度必须大于0 @NotBlank 用在String上面,一般用来校验Stri 阅读详情

在 Spring Boot 项目中,@Valid 和 @Validated 是两个用于数据校验的关键注解。它们都基于 JSR-380(Bean Validation 2.0)规范,但在功能和使用场景上有明显区别。


✅ 一、核心作用对比

特性@Valid@Validated
来源jakarta.validation.Valid(标准 JSR)org.springframework.validation.annotation.Validated(Spring 扩展)
是否支持分组校验❌ 不支持✅ 支持
是否支持方法级别校验(如 service)❌ 仅支持嵌套对象✅ 支持方法参数、返回值
是否支持组合注解✅ 可用于嵌套对象✅ 更灵活
是否支持 @Valid 级联校验✅ 支持✅ 支持

✅ 二、详细区别说明

1. @Valid:标准 JSR 校验注解

  • 作用:触发 JSR-380 规范的校验逻辑。
  • 使用位置:
    • 方法参数(如 @RequestBody)
    • 嵌套对象字段(级联校验)
  • 特点:
    • 是 Java Bean Validation 的标准注解,不依赖 Spring。
    • 支持 @Valid 嵌套对象自动校验(级联校验)。
    • 不支持分组校验 和 方法级别的校验。

2. @Validated:Spring 扩展校验注解

  • 作用:Spring 提供的增强版校验注解,支持更复杂的校验场景。
  • 使用位置:
    • 类上(启用校验功能)
    • 方法参数上(配合分组)
    • Service 层方法上(AOP 校验)
  • 特点:
    • 是 Spring 特有的注解,必须配合 Spring 使用。
    • 支持 分组校验(如新增、更新不同规则)。
    • 支持在 Service 层进行方法参数校验。
    • 可用于 @RequestParam、@PathVariable 等非对象参数。

✅ 三、使用场景总结

场景推荐注解说明
接收 JSON 请求体(@RequestBody)@Valid最常见用法,配合 DTO 使用
嵌套对象校验(级联)@Valid必须用 @Valid 标记嵌套对象
区分“新增”和“更新”校验规则@Validated + 分组使用分组实现不同校验逻辑
校验 @RequestParam、@PathVariable@Validated@Valid 无法直接用于基本类型
Service 层方法参数校验@ValidatedAOP 拦截实现校验
自定义校验器组合使用@Validated更灵活控制

✅ 四、具体使用示例(含中文注释)

📁 项目结构

src/main/java/
├── dto/
│   ├── UserDTO.java
│   └── AddressDTO.java
├── controller/
│   └── UserController.java
├── service/
│   └── UserService.java
├── validation/
│   ├── CreateGroup.java
│   └── UpdateGroup.java

1. 定义分组接口(用于区分校验场景)

// validation/CreateGroup.java
package com.example.demo.validation;

/**
 * 新增场景校验分组
 */
public interface CreateGroup {
}
// validation/UpdateGroup.java
package com.example.demo.validation;

/**
 * 更新场景校验分组
 */
public interface UpdateGroup {
}

2. DTO 对象:UserDTO.java

package com.example.demo.dto;

import com.example.demo.validation.CreateGroup;
import com.example.demo.validation.UpdateGroup;
import jakarta.validation.Valid;
import jakarta.validation.constraints.*;
import java.math.BigDecimal;
import java.time.LocalDate;

/**
 * 用户数据传输对象
 * 包含不同场景下的校验规则
 */
@Getter
@Setter
public class UserDTO {

    // ID 在更新时必须存在,在新增时应为空
    @Null(groups = CreateGroup.class, message = "新增时ID必须为空")
    @NotNull(groups = UpdateGroup.class, message = "更新时ID不能为空")
    private Long id;

    @NotBlank(message = "用户名不能为空")
    @Size(min = 3, max = 20, message = "用户名长度为 {min} 到 {max} 个字符")
    private String username;

    @Email(message = "邮箱格式不正确")
    private String email;

    // 嵌套对象:必须使用 @Valid 实现级联校验
    @Valid
    private AddressDTO address;

    // 其他字段...
}

3. 嵌套对象:AddressDTO.java

package com.example.demo.dto;

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;

/**
 * 地址信息 DTO
 * 用于级联校验
 */
@Getter
@Setter
public class AddressDTO {

    @NotBlank(message = "省不能为空")
    private String province;

    @NotBlank(message = "市不能为空")
    private String city;

    @Size(max = 200, message = "详细地址不能超过 {max} 个字符")
    private String detail;

    // Getters and Setters
}

4. Controller 使用示例

package com.example.demo.controller;

import com.example.demo.dto.UserDTO;
import com.example.demo.validation.CreateGroup;
import com.example.demo.validation.UpdateGroup;
import jakarta.validation.Valid;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

/**
 * 用户控制器
 * 演示 @Valid 和 @Validated 的不同使用方式
 */
@RestController
@RequestMapping("/api/users")
@Validated  // 必须加在类上,才能使 @Validated 在方法参数上生效
public class UserController {

    /**
     * 新增用户:使用 CreateGroup 分组校验
     * @param userDTO 校验分组为 CreateGroup
     */
    @PostMapping
    public ResponseEntity<String> createUser(
            @Validated(CreateGroup.class) // 指定校验分组
            @RequestBody UserDTO userDTO) {

        // 校验通过
        return ResponseEntity.ok("用户新增成功: " + userDTO.getUsername());
    }

    /**
     * 更新用户:使用 UpdateGroup 分组校验
     */
    @PutMapping
    public ResponseEntity<String> updateUser(
            @Validated(UpdateGroup.class)
            @RequestBody UserDTO userDTO) {

        return ResponseEntity.ok("用户更新成功: " + userDTO.getUsername());
    }

    /**
     * 根据 ID 查询用户
     * 演示 @Validated 校验 @PathVariable
     */
    @GetMapping("/{id}")
    public ResponseEntity<String> getUserById(
            @PathVariable
            @Min(value = 1L, message = "用户ID必须大于0", groups = UpdateGroup.class)
            Long id) {

        return ResponseEntity.ok("查询用户ID: " + id);
    }

    /**
     * 根据邮箱查询用户
     * 演示 @Validated 校验 @RequestParam
     */
    @GetMapping("/search")
    public ResponseEntity<String> searchUser(
            @RequestParam
            @Email(message = "邮箱格式不正确")
            String email) {

        return ResponseEntity.ok("搜索邮箱: " + email);
    }
}

5. Service 层方法校验(@Validated 的高级用法)

package com.example.demo.service;

import com.example.demo.validation.CreateGroup;
import com.example.demo.dto.UserDTO;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;

import jakarta.validation.Valid;

/**
 * 用户服务层
 * 演示在 Service 中使用 @Validated 进行方法参数校验
 */
@Service
@Validated  // 必须加在类上,启用方法校验 AOP
public class UserService {

    /**
     * 保存用户信息
     * 方法参数校验由 Spring AOP 拦截处理
     */
    public void saveUser(@Validated(CreateGroup.class) @Valid UserDTO userDTO) {
        System.out.println("保存用户: " + userDTO.getUsername());
        // 业务逻辑...
    }
}

⚠️ 注意:@Validated 要生效,必须加在类上,且类由 Spring 管理。


✅ 五、全局异常处理器(处理校验失败)

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleMethodArgumentNotValid(MethodArgumentNotValidException ex) {
        // 处理 @Valid 校验失败
    }

    @ExceptionHandler(ConstraintViolationException.class)
    public ResponseEntity<ErrorResponse> handleConstraintViolation(ConstraintViolationException ex) {
        // 处理 @Validated 方法参数校验失败(如 @Min on @PathVariable)
    }
}

✅ 六、测试示例

1. 新增用户(ID 不能有值)

POST /api/users
{
  "id": 100,
  "username": "test",
  "email": "test@example.com",
  "address": { "province": "北京", "city": "北京", "detail": "中关村" }
}

返回错误:

新增时ID必须为空

2. 更新用户(ID 必须有值)

PUT /api/users
{
  "username": "updated",
  "email": "new@example.com"
}

返回错误:

更新时ID不能为空

3. 查询用户(路径变量校验)

GET /api/users/0

返回错误:

用户ID必须大于0

✅ 七、总结:如何选择?

需求使用注解
接收 JSON 请求体校验✅ @Valid
嵌套对象级联校验✅ @Valid
区分“新增”和“更新”规则✅ @Validated + 分组
校验 @RequestParam / @PathVariable✅ @Validated
Service 层方法参数校验✅ @Validated
纯标准 JSR 校验(非 Spring)✅ @Valid

✅ 八、最佳实践建议

  1. Controller 方法参数:优先使用 @Valid + @RequestBody
  2. 需要分组校验:使用 @Validated(Group.class)
  3. 非对象参数校验:使用 @Validated + @Min, @Email 等
  4. 嵌套对象:必须用 @Valid 标记
  5. 全局异常处理:统一捕获 MethodArgumentNotValidException 和 ConstraintViolationException
  6. Service 层校验:谨慎使用,避免性能开销

🎯 结论

注解适用场景关键词
@Valid对象校验、级联校验标准、嵌套、JSON
@Validated分组、方法参数、Service 校验Spring、分组、AOP

✅ 简单记:

  • @Valid 用于“对象内部校验”
  • @Validated 用于“场景控制和方法级别校验”

两者可以协同使用,构建完整、灵活的校验体系。

@Validated和@Valid区别:Spring validation验证框架对入参实体进行嵌套验证必须在相应属性(字段)加上@Valid而不是@Validated Spring Validation验证框架对参数的验证机制提供了@Validated(Spring's JSR-303规范,是标准JSR-303的一个变种),javax提供了@Valid(标准JSR-303规范),配合BindingResult可以直接提供参数验证结果。其中对于字段的特定验证注解比如@NotNull等网上到处都有,这里不详述在检验Controller的入参是否符合规范时,使用@Va... 阅读详情

相关推荐

SpringBoot参数校验@Valid 和 @Validated注解使用详解

SpringBoot参数校验@Valid 和 @Validated注解使用详解

Charge8的博客 1万+

Validated、Valid 、Validator,他们的区别你知道几个

结论先出 Valid VS Validated 不同点? javax.validation.Valid 是JSR-303规范标准注解支持,是一个标记注解。 注解支持ElementType#METHOD,ElementType#FIELD,ElementType#CONSTRUCTOR,ElementType#PARAMETER,ElementType#TYPE_USE org.springframework.validation.annotation.Validated 是Spri...

琦彦 5391

别再混淆了!一文带你搞懂@Valid和@Validated的区别

本文介绍了@Valid注解和@Validated注解的不同,同时也进一步介绍了Springboot 参数校验的使用。

做一个有思想的技术人 7435

实战经验分享之:使用@Validated和@Valid进行数据校验

在上面笔者介绍了 @Validated 和 @Valid 注解的作用及使用方法。@Validated 注解主要用于Spring controller 层,在类或方法上进行数据校验,而 @Valid 注解则用于普通 Java 类的数据校验。这两个注解结合 Java Bean Validation 为我们提供了一种简单而强大的数据校验解决方案,帮助我们确保数据的合法性和完整性,从而增加应用程序的稳定性和可靠性。

清晨qc的博客 1027

@Valid 和 @Validated注解的使用

@Valid 和 @Validated注解的使用1,@Valid 和 @Validated 的作用2,@Valid 和 @Validated 的区别3,@Valid 的使用4,@Validated 的使用5,相关注解 1,@Valid 和 @Validated 的作用         现在项目大多都是分布式项目,前端往后端传数据的时候,为了保证数据的有效、可用性,需要对前端传入的数据进行校验,但是大量的校验会很繁琐,造成代码中出

qq_46540738的博客 2504

STC8H单片机ADC实战:从读取电位器到串口绘图,12位精度玩起来

本文详细介绍了STC8H单片机的ADC功能实战应用,从读取电位器到串口绘图,展示了12位精度的实现方法。通过硬件连接、代码配置、串口数据传输及高级优化技巧,帮助开发者快速掌握ADC模块的使用,适用于各种传感器数据采集和信号处理场景。

weixin_28278377的博客 341

@Valid 注解的详细作用

在你的代码中,@Valid。

BillKu的博客 746

国密(3)- 预主密钥/主密钥计算和Finished消息的加解密

国密的ECC-SM3-SM4-CBC模式下的预主密钥和主密钥的生成过程介绍,以及Finished消息的加解密介绍

weixin_43408952的博客 6509

@Valid和@Validated注解校验以及异常处理

@Valid和@Validated注解校验以及异常处理

m0_58680865的博客 2万+

从零到一:STM32G431的DSP库集成与FFT实战避坑指南

本文详细介绍了在STM32G431微控制器上集成CMSIS-DSP库并进行FFT实战开发的完整流程。重点解析了通过CubeMX和Keil环境配置DSP库的关键步骤、编译器宏定义陷阱及解决方案,并提供了FFT算法优化、内存管理及常见问题诊断的实用技巧,帮助开发者高效实现嵌入式信号处理应用。

oauth7security的博客 768

Mac上安装Label Studio

以上步骤详细说明了如何在Mac上通过Anaconda安装Label Studio。记得根据你的具体需求选择是否创建新的环境,并使用conda或pip进行安装。安装完成后,务必验证Label Studio是否成功运行。

g2526的博客 1956

@Validated和@Valid区别

Spring Validation验证框架对参数的验证机制提供了@Validated(Spring’s JSR-303规范,是标准JSR-303的一个变种),javax提供了@Valid(标准JSR-303规范),配合BindingResult可以直接提供参数验证结果。 JSR303定义的校验类型 空检查 @Null 验证对象是否为null @NotNull 验证对象是否不为null, 无法...

wangjiangongchn的博客 3万+

雷达气象学(8)——反射率因子图实战(强对流预警篇)

本文聚焦雷达反射率因子图在强对流预警中的实战应用,深入解析了柱状回波、有界弱回波区(BWER)、三体散射(TBSS)等关键回波结构特征,这些是识别超级单体风暴和大冰雹的核心“身份证”。文章强调从静态识别转向动态追踪与多源数据综合研判的思维转变,并提供了系统的实战分析流程与常见误区避坑指南,旨在提升对强对流天气的短临预警能力。

weixin_29213827的博客 485

@Validated注解详解,分组校验,嵌套校验,@Valid和@Validated 区别,Spring Boot @Validated

技术栈: spring boot2.3.3.RELEASE hibernate-validator 文末附项目源代码 目录 简述 项目依赖 全局异常处理类 基础参数校验 实体类 控制类 测试 嵌套参数验证 实体类 控制类 测试 分组参数验证 接口类 实体类 控制类 测试 @Valid和@Validated 区别 简述 @Validation是一套帮助我们继续对传输的参数进行数据校验的注解,通过配置Validation可以很轻松的完成对数据的约束。 @...

qq_32352777的博客 18万+

大模型长对话中上下文无法承载全部历史,如何压缩或提取重点

如果说截断和滑动窗口是“硬性”压缩,那摘要生成技术就显得“软”多了,也更接近于智能化的解决方案。它的思路是:不直接丢弃历史,而是通过自然语言处理(NLP)技术,把冗长的对话记录浓缩成一段简短的摘要,保留核心信息。这样既能大幅减少token数量,又不至于丢失关键内容。这种方法通常会借助预训练模型,比如BART或T5,它们擅长从长文本中提取重点内容。

大模型大数据攻城狮的专栏 1584

thermal系列(5)-DTSI中配置Thermal

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.youkuaiyun.com/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 目录thermal系列目录DTSI中配置ThermalDTSI节点类型描述CPU0的配置举例CPU核hot-plugging举例修改热缓解阈值DTSI的node中带有tracks-lowDTSI中关闭某个Thermal Zones thermal系列目录 thermal系列(1)-引言部分 thermal.

fulinux的博客 1229

Spring注解之@validated的使用

spring-boot中可以用@validated来校验数据,如果数据异常则会统一抛出异常,方便异常中心统一处理。 比如,我们判断一个输入参数是否合法,可以用如下方式: 一 基础使用 因为spring-boot已经引入了基础包,所以直接使用就可以了 首先在controller上声明需要对数据进行校验 @RequestMapping(value="/url.json",method= {RequestMethod.POST}) @ResponseBody @Transactional public Res

u010349272的博客 12万+

拉曼光谱入门:7.拉曼光谱仪光学系统结构详解

本文系统拆解了拉曼光谱仪从激光器输出经聚焦照明、二向色镜/陷波滤光片组滤除瑞丽散射、衍射光栅色散至CCD探测的完整光路,阐述了各光学模块在微弱非弹性散射信号提取、杂散光抑制及高分辨光谱成像中的工程原理与技术参数要求。

qq_53529450的博客 223

Springboot @Validated和@Valid的区别 及使用

概述: @Valid是使用Hibernate validation的时候使用 @Validated是只用Spring Validator校验机制使用 说明:java的JSR303声明了@Valid这类接口,而Hibernate-validator对其进行了实现 @Validation对@Valid进行了二次封装,在使用上并没有区别,但在分组、注解位置、嵌套验证等功能上有所不同,这里主要就这...

大菠萝一号 4万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Spring 数据校验:@Validated 与@Valid 注解全面对比与应用

@Valid和@Validated,一字之差却暗藏玄机!本文深入对比两大注解的核心区别,揭示最佳实践,帮你轻松驾驭Spring数据校验,远离参数异常。

异常君的博客 2069

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

springboot中@Validated注解使用,以及与@Valid注解区别

为什么使用@Validated         前端传过来数据的时候,要进行校验,但是大量的校验很繁琐,会造成大量的if else语句的产生,所以@Valid和@Validated很好的解决了这个问题. @Validated与@Valid注解区别 ①,所属的包不同 @Valid属于javax.validation包下,是jdk给提供的 @Validated是org.springframework.validation.annotation包下的,是sp

神都燕 7786

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

@Validated注解和@Valid注解区别

@Validated注解和@Valid注解详解引入依赖@Validated注解和@Valid注解区别@Valid注解使用场景演示嵌套校验和controller层请求参数校验@Valid注解校验不通过会抛出MethodArgumentNotValidException异常@Valid注解的请求参数后面紧跟一个BindingResult对象,来封装校验结果全局处理异常MethodArgumentNotValidException@Validated使用场景演示controller请求参数校验对配置文件的装配进行

m0_53157173的博客 6161

SpringBoot @Validated注解实现参数校验

1. 前言 做web开发有一点很烦人就是要校验参数,基本上每个接口都要对参数进行校验,比如一些格式校验 非空校验都是必不可少的。如果参数比较少的话还是容易 处理的一但参数比较多了的话代码中就会出现大量的IF ELSE就比如下面这样: 这个例子只是校验了一下空参数。如果需要验证邮箱格式和手机号格式校验的话代码会更多,所以介绍一下validator通过注解的方式进行校验参数。 2. 什么是Validator Bean Validation是Java定义的一套基于注解的数据校验规范,目前已经从JSR 303的1

爱哭的毛毛虫 2万+

《SpringBoot篇》12.@Valid与@Validated的区别

说明:其实@Valid 与 @Validated都是做数据校验的,只不过注解位置与用法有点不同。不同点:(1)@Valid是使用Hibernate validation的时候使用。@Validated是只用Spring Validator校验机制使用。(2)@Valid 可以嵌套验证@Validation 不能进行嵌套验证(3)@Valid:可以用在方法、构造函数、方法参数和成员属性(field)上。@Validated:用在类、方法和方法参数上。

陈老老老板的博客 7725

别再乱用了,这才是 @Validated 和 @Valid 的真正区别和用法

在平时写接口的时候,需要进行参数的校验,如果参数少的话,使用if else还可以,但是参数多的时候,要写一大堆if else校验,敲的太累也不优雅。所以今天将介绍使用注解来进行参数校验,既方便,还优雅。

qq_66627105的博客 3659

@Valid与@Validated区别

1.@Valid与@Validated作用 @Valid与@Validated都是用来校验接收参数的。 @Valid是使用Hibernate validation的时候使用 @Validated是只用Spring Validator校验机制使用 说明:java的JSR303声明了@Valid这类接口,而Hibernate-validator对其进行了实现。 @Validated与@Valid区别: @Validated:可以用在类型、方法和方法参数上。但是不能用在成员属性(字段)上,不支持

qq_33274797的博客 1万+
上一篇: commons-dto 工具模块设计规范
下一篇: MyBatis-Plus Lambda 条件构造器全面实战指南
龙茶清欢
博客等级 码龄7年 3720粉丝 375原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙茶清欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值