在日常開發中,我們常用 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 頁面。
- ? 復雜業務校驗(跨字段等)仍需自定義注解。