Spring MVC 原生支持 Bean Validation(JSR-303),但 @Valid 僅作用於 @RequestBody 或 @ModelAttribute 綁定的對象。對於 @RequestParam 綁定的單個基本類型參數,直接加 @Size 等註解無效。本文介紹如何通過 @Validated 開啟方法級校驗能力。
@ControllerAdvice
@Component
public class GlobalExceptionHandler {
@Bean
public MethodValidationPostProcessor methodValidationPostProcessor() {
return new MethodValidationPostProcessor(); // 關鍵:註冊方法校驗後處理器
}
@ExceptionHandler(ValidationException.class)
@ResponseBody
@ResponseStatus(HttpStatus.BAD_REQUEST)
public String handle(ValidationException ex) {
System.out.println("bad request, " + ex.getMessage());
return "bad request, " + ex.getMessage();
}
}
MethodValidationPostProcessor 會掃描帶 @Validated 的 Controller,為其方法參數織入校驗邏輯。
對於完整對象,仍使用 @Valid + BindingResult:
@PostMapping("validObject")
public String validObject(@RequestBody @Valid Foo foo, BindingResult result) {
if (result.hasErrors()) { ... }
return foo.getValidString();
}
| 場景 | 註解 | 是否需 @Validated 類註解 |
|---|---|---|
| @RequestBody / @ModelAttribute 對象 | @Valid | 否 |
| @RequestParam / @PathVariable 單參數 | @Size、@NotNull 等 | 是(類上加 @Validated) |
@Validated → 校驗不生效,無任何報錯。MethodValidationPostProcessor Bean → 同樣不生效。ConstraintViolationException(繼承自 ValidationException),需在 @ExceptionHandler 中捕獲對應異常類型。@Validated 開啟了 Spring MVC 方法級參數校驗能力,讓 @RequestParam、@PathVariable 等單參數也能享受聲明式校驗。配合全局異常處理,即可實現優雅的參數校驗與統一錯誤響應。