Microduck 开源语音助手完整复刻:ESP32-S3 嵌入式 AI 实战指南
2026/9/6 3:07:28
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 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,常用校验注解主要分为以下几类:
--字符串判空类(最容易混淆,需特别注意)
| 注解 | 适用于 | 校验规则 / 允许的情况 | 常用场景 |
@NotBlank | String | 最严格:不能为null,且去掉前后空格后长度必须> 0 | 邮箱、手机号、用户名、密码、验证码 |
@NotEmpty | String, 集合, 数组, Map | 不能为null,且长度/元素个数> 0(对字符串允许" "纯空格) | 批量删除时的 ID 数组/列表 |
@NotNull | 任意类型 | 不能为null(但如果是空字符串""或空集合[]依然能通过) | 对象、包装类型(如Long userId)、枚举 |
| 注解 | 适用于 | 核心功能与示例 | 常用场景 |
@Pattern | String | 满足指定的正则表达式,如regexp = "^\\d{6}$" | 手机号格式、身份证号、固定格式编码 |
@Size | String, 集合, 数组 | 限制字符串长度或集合大小,如@Size(min = 6, max = 20) | 限制密码/昵称长度、限制批量操作的最大数量 |
@Email | String | 校验是否符合标准电子邮箱格式 | 用户注册邮箱 |
| 注解 | 适用于 | 核心功能与示例 | 常用场景 |
@Min/@Max | 数字类型 | 限制最小/最大值(包含边界值),如@Min(1) | 页码pageNum、每页条数pageSize |
@Range | 数字类型 | (来自 Hibernate Validator)限制数值在某区间,如@Range(min = 1, max = 120) | 年龄、月份范围 |
@Positive/@PositiveOrZero | 数字类型 | 必须为正数/正数或 0 | 金额、商品数量、ID 主键 |
| 注解 | 适用于 | 核心功能与示例 | 常用场景 |
@Past/@PastOrPresent | 日期/时间类型 | 必须是过去的时间/过去或当前时间 | 出生日期、日志查询开始时间 |
@Future/@FutureOrPresent | 日期/时间类型 | 必须是未来的时间/将来或当前时间 | 活动结束时间、预约时间、优惠券到期时间 |
| 注解 | 适用于 | 核心功能与示例 | 常用场景 |
@IsTrue/@IsFalse | Boolean | 必须为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; }