Spring Boot中使用@Valid校验需两步:为DTO添加jakarta.validation注解并在Controller参数前加@Valid;Spring Boot 2.3+须引入spring-boot-starter-validation依赖,校验失败抛MethodArgumentNotValidException,建议用@ControllerAdvice统一处理。

在 Spring Boot 的 Controller 方法中使用 @Valid 触发参数校验,核心是两步:给参数对象加校验注解(如 @NotNull、@Size),并在该参数前加上 @Valid;同时确保项目已启用校验支持(Spring Boot 2.3+ 默认不包含 spring-boot-starter-validation,需手动引入)。
添加校验依赖(Spring Boot 2.3+ 必须)
Spring Boot 2.3 起移除了对 jakarta.validation 的默认传递依赖。若未显式引入,编译或运行时会报 javax.validation.* 或 jakarta.validation.* 类找不到。
- 如果是 Maven 项目,在
pom.xml中添加:
<dependency><groupid>org.springframework.boot</groupid><artifactid>spring-boot-starter-validation</artifactid></dependency>
- 该 starter 内置了 Hibernate Validator 实现,支持
@NotBlank、@Email、@Min等常用注解。
定义带校验规则的 DTO 类
校验逻辑写在请求参数对应的 Java Bean(如 DTO)上,而不是 Controller 方法里。
- 使用
jakarta.validation.constraints.*(新版本)或javax.validation.constraints.*(旧版)注解 - 推荐用
jakarta(对应 Java EE 9+ / Jakarta EE),Spring Boot 3.x 强制要求
public class UserRegisterDTO {
@NotBlank(message = "用户名不能为空")
@Size(min = 2, max = 20, message = "用户名长度为2-20个字符")
private String username;
@Email(message = "邮箱格式不正确")
private String email;
@Min(value = 18, message = "年龄不能小于18")
private Integer age;
// getter / setter 省略
}在 Controller 方法参数上使用 @Valid
@Valid 必须直接标注在需要校验的对象参数前,且该参数不能是基本类型或简单包装类(如 String、Integer)——它只对对象生效。
- 如果校验失败,默认抛出
MethodArgumentNotValidException - Spring 会自动绑定并触发 Bean Validation,无需手动调用
validator.validate()
@PostMapping("/register")
public Result register(@Valid @RequestBody UserRegisterDTO dto) {
// 校验通过才执行这里
userService.register(dto);
return Result.success();
}注意:@Valid 和 @RequestBody 顺序无关,但 @Valid 必须紧邻参数声明。
统一处理校验失败异常
不捕获的话,校验失败会返回 HTTP 400 + 默认错误页。建议用 @ControllerAdvice 全局捕获并返回结构化 JSON:
@RestControllerAdvice
public class ValidationExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public Result handleValidationExceptions(MethodArgumentNotValidException ex) {
List<string> errors = ex.getBindingResult()
.getFieldErrors()
.stream()
.map(error -> error.getField() + ": " + error.getDefaultMessage())
.collect(Collectors.toList());
return Result.fail("参数校验失败", errors);
}
}</string>- 也可提取第一个错误(更简洁),或封装成标准错误码格式
- 若用
@Validated(支持分组校验),异常类型为ConstraintViolationException,需额外处理
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











