Spring Boot 使用 @NotBlank + @Validated 优雅校验参数

发布于:2025-08-15 ⋅ 阅读:(18) ⋅ 点赞:(0)

在日常开发中,我们常用 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 页面。
  • ⚠ 复杂业务校验(跨字段等)仍需自定义注解。


网站公告

今日签到

点亮在社区的每一天
去签到