Spring 使用 @Validated 实现方法入参校验,需通过 @EnableMethodValidation 启用支持,配合参数上的校验注解(如 @NotNull)及 @Validated 触发校验,支持分组与嵌套校验,并统一处理 ConstraintViolationException 异常。

Spring 使用 @Validated 对方法入参校验,核心是开启方法级别的验证支持,并在参数上标注校验注解(如 @NotNull、@Size 等),再配合 @Validated 触发校验逻辑。它比 @Valid 更灵活,支持分组校验和嵌套校验。
启用方法验证支持
Spring 默认不开启对方法参数的 Bean Validation 支持,需显式启用:
- 在配置类中添加
@EnableMethodValidation注解(Spring Boot 2.3+ 推荐方式) - 或手动注册
MethodValidationPostProcessorBean(旧版本兼容写法)
例如:
@Configuration
@EnableMethodValidation
public class ValidationConfig {
}
在 Controller 或 Service 方法上使用 @Validated
@Validated 可加在类或方法上,作用于其所有带校验注解的参数:
- 加在类上:该类所有含校验注解的 public 方法参数都会被校验
- 加在方法上:仅对该方法生效
- 可指定校验分组,如
@Validated(UserCreate.class)
示例:
@RestController
@Validated // 类级别启用
public class UserController {
@PostMapping("/users")
public ResponseEntity<String> createUser(
@Validated(UserCreate.class) @RequestBody User user) {
return ResponseEntity.ok("created");
}
}
为参数添加校验注解
校验注解需加在方法参数上(支持 @RequestBody、@RequestParam、@PathVariable 等):
-
@RequestBody参数:直接在对象字段上加注解(如User类的@NotBlank) -
@RequestParam/@PathVariable:注解直接加在参数上,需配合@Validated才生效
例如:
public String getUserById(
@Validated @RequestParam @Min(1) Long id,
@Validated @RequestParam @NotBlank String name) { ... }
处理校验失败
校验失败时默认抛出 ConstraintViolationException(方法参数校验)或 MethodArgumentNotValidException(@RequestBody + @Valid)。建议统一捕获并返回友好提示:
- 用
@ControllerAdvice拦截ConstraintViolationException - 提取
constraintViolations中的错误信息,组装成 JSON 响应
注意:@Validated 触发的是 JSR-303 的方法验证机制,异常类型与控制器层的 @Valid 不同,需区分处理。


















