@Validated和@Valid注解
2026/9/6 2:22:01 网站建设 项目流程

1.二者区别于配合方式

注解常见放置位置核心作用
@Validated(Spring 提供)类名上方(如UserController)开启整个 Controller 类的校验功能,直接对StringInteger等平铺参数生效。
@Valid(JSR-303 标准)方法参数对象前(如@Valid @RequestBody DTO)开启嵌套/对象级校验,触发 DTO 对象内部属性上的注解校验。

代码对比如下

@RestController @RequestMapping("/api/user") @Validated // 1. 类级别注解:开启整个类的简单参数校验能力 public class UserController { // 简单参数:不需要在参数前加 @Valid,直接生效 @GetMapping("/sendCaptcha") public BaseResponse<String> sendCaptcha( @NotBlank @Email @RequestParam String targetEmail ) { ... } // 对象参数:必须加 @Valid,否则 UserRegisterRequest 内部的 @NotBlank 等注解统统会被忽略! @PostMapping("/register") public BaseResponse<LoginAndRegisterResponse> register( @Valid @RequestBody UserRegisterRequest userRegisterRequest ) { ... } }

2.常用校验注解

在基于JSR-303 / Jakarta Bean Validation(如spring-boot-starter-validation)做接口参数校验时,除了你前面看到的@NotBlank@Email,常用校验注解主要分为以下几类:

--字符串判空类(最容易混淆,需特别注意)

注解适用于校验规则 / 允许的情况常用场景
@NotBlankString最严格:不能为null,且去掉前后空格后长度必须> 0邮箱、手机号、用户名、密码、验证码
@NotEmptyString, 集合, 数组, Map不能为null,且长度/元素个数> 0(对字符串允许" "纯空格)批量删除时的 ID 数组/列表
@NotNull任意类型不能为null(但如果是空字符串""或空集合[]依然能通过)对象、包装类型(如Long userId)、枚举

-- 字符串格式与长度类

注解适用于核心功能与示例常用场景
@PatternString满足指定的正则表达式,如regexp = "^\\d{6}$"手机号格式、身份证号、固定格式编码
@SizeString, 集合, 数组限制字符串长度或集合大小,如@Size(min = 6, max = 20)限制密码/昵称长度、限制批量操作的最大数量
@EmailString校验是否符合标准电子邮箱格式用户注册邮箱

-- 数值与范围限制类

注解适用于核心功能与示例常用场景
@Min/@Max数字类型限制最小/最大值(包含边界值),如@Min(1)页码pageNum、每页条数pageSize
@Range数字类型(来自 Hibernate Validator)限制数值在某区间,如@Range(min = 1, max = 120)年龄、月份范围
@Positive/@PositiveOrZero数字类型必须为正数/正数或 0金额、商品数量、ID 主键

---时间与日期限制类

注解适用于核心功能与示例常用场景
@Past/@PastOrPresent日期/时间类型必须是过去的时间/过去或当前时间出生日期、日志查询开始时间
@Future/@FutureOrPresent日期/时间类型必须是未来的时间/将来或当前时间活动结束时间、预约时间、优惠券到期时间

---布尔值类

注解适用于核心功能与示例常用场景
@IsTrue/@IsFalseBoolean必须为truefalse用户注册时勾选“同意隐私协议”(@IsTrue

💡 生产环境最佳搭配方案

在实际写代码(如 DTO 请求类)时,这些注解经常做组合搭配

public class UserRegisterRequest { // 1. 非空 + 邮箱格式 @NotBlank(message = "邮箱不能为空") @Email(message = "邮箱格式不正确") private String email; // 2. 非空 + 长度限制 + 正则(要求必须包含字母和数字) @NotBlank(message = "密码不能为空") @Size(min = 8, max = 20, message = "密码长度必须在 8-20 位之间") @Pattern(regexp = "^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]{8,20}$", message = "密码必须包含字母和数字") private String password; // 3. 嵌套校验对象(如果 DTO 里面还包着另一个实体/DTO,必须加上 @Valid 才会触发深层校验) @NotNull(message = "扩展信息不能为空") @Valid private UserExtInfo extInfo; }

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询