Spring Boot参数校验需分层处理:基础用JSR-303注解+@Valid;统一异常处理捕获MethodArgumentNotValidException;进阶支持分组、嵌套、集合校验;业务逻辑校验须在Service层实现。

Spring Boot 参数校验是面试高频考点,重点不在“会不会写@Valid”,而在于能否分清场景、讲清层次、给出可落地的工程化方案。
基础校验:用 JSR-303 注解 + @Valid 是标准做法
登录、新增用户等接口,字段有明确格式要求(非空、长度、邮箱格式、数值范围),直接在 DTO 上加约束注解即可:
- @NotBlank:校验字符串非 null 且 trim 后不为空(适合用户名、密码)
- @Email:校验邮箱格式(注意它不检查域名是否存在)
- @Min/@Max:用于数字类型的基本范围控制
- @Pattern:正则校验,比如手机号 ^1[3-9]\d{9}$
- Controller 方法参数前必须加 @Valid(或 @Validated),否则注解不生效
统一异常处理:避免每个接口都 try-catch
手动 if 判空会污染业务逻辑,也不利于维护。推荐用 @ControllerAdvice + @ExceptionHandler 拦截 MethodArgumentNotValidException:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 捕获该异常后,提取 BindingResult 中所有错误信息,组装成标准响应体(如 {code:400, msg:"参数校验失败", data:{...}})
- 注意区分全局异常(如空指针)和参数异常,不要把所有异常都塞进一个 handler
- 生产环境建议记录日志(含请求路径、参数快照),便于排查前端传参问题
进阶场景:分组校验、嵌套校验、集合校验
真实业务中,新增和修改往往校验规则不同(比如 ID 新增时不能传、修改时必须传),这时需要分组:
- 定义两个空接口作为校验组,如 interface AddGroup {} 和 interface UpdateGroup {}
- 注解上指定 groups = AddGroup.class,Controller 方法参数用 @Validated({AddGroup.class})
- 对象内嵌另一个校验对象,只需在字段上加 @Valid,框架自动递归校验
- 校验 List
,需在参数前加 @Valid,同时在 DTO 字段上加 @Valid(双重 Valid)
业务校验:不能只靠注解,要结合 Service 层逻辑
像“用户名已存在”“库存不足”这类依赖数据库或外部服务的判断,不属于参数格式问题,不能放在 DTO 校验里:
- 应在 Service 方法开头做 check,抛出自定义业务异常(如 UserExistException)
- 统一异常处理器中补充对该类异常的捕获,返回对应业务码(如 code=1001)
- 避免在 Controller 层查库——破坏分层,也影响事务控制










