Spring Boot 使用 @NotBlank + @Validated 优雅校验参数
在日常开发中,我们常用 if (isBlank(...))
来判断参数是否为空,但这种方式不仅繁琐,而且容易遗漏。
Spring 生态中推荐使用 JSR-303 校验注解(@NotBlank
、@NotNull
等)配合 @Validated
实现自动校验,大幅减少手动判空逻辑。
1. 与普通判空对比
对比项 | 传统 if 判空 | @NotBlank + @Validated |
---|---|---|
代码量 | 需重复写大量 if 判断 | 仅在 DTO 字段加注解 |
校验位置 | 分散在 Controller / Service | 集中在 DTO |
维护性 | 校验规则难统一 | 规则集中,易维护 |
功能 | 只能判断空 | 支持格式、长度、正则等多种校验 |
2. 使用步骤
(1) DTO 添加校验注解
常用注解说明:
@NotBlank
:用于字符串,不能为空且去除空格后长度必须大于 0。@Pattern
:通过正则表达式验证数据格式。@NotNull
:用于任意对象,不能为空(非字符串)。@NotEmpty
:用于集合/数组,不能为空且长度大于 0。@Email
:校验邮箱格式。
@Data
public class UserLoginDTO {// 手机号:不能为空,并且必须符合正则规则(1开头的11位手机号)@NotBlank(message = "手机号不能为空!")@Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式不正确!")private String phone;// 验证码:不能为空@NotBlank(message = "验证码不能为空!")private String code;
}
(2) Controller 启用校验
@Validated
:触发参数对象的校验。@RequestBody
:将 JSON 请求体映射为 Java 对象。
@RestController
public class UserController {@PostMapping("/register")public Result<String> register(@Validated @RequestBody UserLoginDTO dto) {return Result.ok("注册成功");}
}
(3) 全局异常处理返回统一格式
@RestControllerAdvice
:全局异常处理类,返回 JSON 格式结果。@ExceptionHandler
:指定处理某类异常的方法。
@RestControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(MethodArgumentNotValidException.class)public Result<String> handleValidException(MethodArgumentNotValidException e) {String msg = e.getBindingResult().getFieldError().getDefaultMessage();return Result.fail(msg);}
}
3. 注意
- ⚠ 需要配合全局异常处理器,否则返回默认 400 页面。
- ⚠ 复杂业务校验(跨字段等)仍需自定义注解。