
1.二者区别于配合方式注解常见放置位置核心作用Validated(Spring 提供)类名上方(如UserController)开启整个 Controller 类的校验功能直接对String、Integer等平铺参数生效。Valid(JSR-303 标准)方法参数对象前(如Valid RequestBody DTO)开启嵌套/对象级校验触发 DTO 对象内部属性上的注解校验。代码对比如下RestController RequestMapping(/api/user) Validated // 1. 类级别注解开启整个类的简单参数校验能力 public class UserController { // 简单参数不需要在参数前加 Valid直接生效 GetMapping(/sendCaptcha) public BaseResponseString sendCaptcha( NotBlank Email RequestParam String targetEmail ) { ... } // 对象参数必须加 Valid否则 UserRegisterRequest 内部的 NotBlank 等注解统统会被忽略 PostMapping(/register) public BaseResponseLoginAndRegisterResponse 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、每页条数pageSizeRange数字类型来自 Hibernate Validator限制数值在某区间如Range(min 1, max 120)年龄、月份范围Positive/PositiveOrZero数字类型必须为正数/正数或 0金额、商品数量、ID 主键---时间与日期限制类注解适用于核心功能与示例常用场景Past/PastOrPresent日期/时间类型必须是过去的时间/过去或当前时间出生日期、日志查询开始时间Future/FutureOrPresent日期/时间类型必须是未来的时间/将来或当前时间活动结束时间、预约时间、优惠券到期时间---布尔值类注解适用于核心功能与示例常用场景IsTrue/IsFalseBoolean必须为true或false用户注册时勾选“同意隐私协议”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; }