掌握Spring Boot参数校验高级技巧需理解校验时机、规则归属与业务语义三层联动,善用分组校验、嵌套对象+分组组合、自定义注解及全局异常处理实现灵活、精准、可维护的校验体系。

掌握 Spring Boot 参数校验高级技巧,关键不在背注解,而在理解“校验时机”“规则归属”和“业务语义”的三层联动。真正用得好的人,往往能把校验逻辑像配置项一样灵活切换,而不是堆 if-else 或拆一堆 VO 类。
分组校验:让一个 DTO 适配多个业务动作
这是最常用也最容易被用错的进阶点。核心是两步绑定:字段注解指定生效分组 + 接口方法激活对应分组。
- 定义清晰的分组接口,比如 Create 和 Update,继承自
Default保证默认规则仍可用 - 在 DTO 字段上按需标注,例如:
@NotNull(groups = Create.class)(新增必填)@Null(groups = Update.class)(更新时禁止传入)@NotBlank(groups = {Create.class, Update.class})(两边都校验) - Controller 方法用
@Validated(Create.class)显式声明当前调用属于哪个场景,Spring 就只执行该组规则
嵌套对象 + 分组组合:处理多层结构的精准控制
订单含商品列表、用户含地址信息——这类嵌套结构不能只靠外层 @Valid 一锤定音。
- 在外层 DTO 字段上加
@Valid,触发嵌套对象校验 - 嵌套对象内部同样支持分组,比如
OrderItemDTO里用@Min(value = 1, groups = Create.class) - 外层调用时传入分组,会自动透传到嵌套对象中,实现全链路规则对齐
自定义注解:把业务规则变成可复用的“校验积木”
手机号、身份证、密码强度、邮箱域名白名单……这些高频规则不值得每次手写正则或 if 判断。
- 新建注解类,如
@Mobile,标记@Constraint(validatedBy = MobileValidator.class) - 实现
ConstraintValidator<Mobile, String>,封装校验逻辑 - 在 DTO 中直接使用
@Mobile private String phone;,和内置注解一样自然 - 还能配合分组,比如
@Mobile(groups = Create.class),做到“只在注册时校验手机”
全局异常统一处理:让错误响应干净又友好
校验失败抛出的是 MethodArgumentNotValidException 或 ConstraintViolationException,直接返回堆栈对前端很不友好。
- 写一个
@RestControllerAdvice类,捕获这两类异常 - 提取所有校验失败字段和 message,组装成标准 JSON 格式,例如:
{"code":400,"msg":"参数校验失败","details":[{"field":"phone","message":"手机号格式不正确"}]} - 顺便支持国际化,用
MessageSource动态读取不同语言的提示文案


















