最有效的简化方式是用声明式注解替代手工if判空,将校验逻辑从Controller/Service剥离至DTO字段,通过@NotBlank、@Email等注解定义规则,@Valid/@Validated触发校验,@RestControllerAdvice统一处理异常,并可封装自定义注解复用复杂规则。

直接用声明式注解替代手工 if 判空,是 Spring Boot 参数校验重构最有效的简化方式。核心不是“少写几行”,而是把校验逻辑从业务流程中剥离出来,让 Controller 只专注接收和转发,验证规则集中在 DTO 上,异常统一拦截处理。
DTO 层加注解,校验规则一目了然
把校验逻辑从 Controller 或 Service 里抽出来,写在请求参数对象(如 UserDTO)的字段上:
- @NotBlank:字符串非空且去掉首尾空格后长度 > 0(比 @NotNull 更严格)
- @Email、@Pattern、@Min/@Max:覆盖格式、范围、正则等常见场景
- 每个注解都带 message 属性,错误提示可读性强,无需再拼接字符串
@Valid 或 @Validated 注解触发自动校验
Controller 方法参数前加一个注解,框架就在绑定参数时自动执行校验:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 单个对象用 @Valid(JSR-303 标准),支持嵌套对象递归校验(如 OrderDTO 中 items 字段为 List
,item 也带注解) - 需要分场景校验(如新增 vs 修改)就用 @Validated(Group.Create.class),配合接口分组定义不同规则集
- 注意:@RequestBody + @Valid 组合会抛 MethodArgumentNotValidException;而 @RequestParam + @Valid 需搭配 @ModelAttribute 才生效
全局异常处理器统一收口错误响应
避免每个接口都 try-catch,用 @RestControllerAdvice 集中处理校验失败:
- 捕获 MethodArgumentNotValidException,提取所有字段错误信息,组装成标准 JSON(如 { "code": 400, "msg": "参数错误", "details": [...] })
- 同时处理 BindException(用于表单提交)、ConstraintViolationException(手动调用 Validator 时抛出)等其他校验异常
- 返回结构一致,前端不用判断多种错误格式,日志也方便聚合分析
复杂规则封装成自定义注解,复用不重复写
当内置注解不够用(比如要校验手机号是否符合运营商号段、身份证是否真实有效),就自己写一个注解:
- 定义注解(如 @ChineseIdCard),标注 @Constraint(validatedBy = IdCardValidator.class)
- 实现 ConstraintValidator
,在 isValid() 里写具体逻辑 - 后续所有需要身份证校验的地方,只写 @ChineseIdCard 就行,规则变更只需改一个类










