spring boot 2.5+需手动引入spring-boot-starter-validation才能启用@notblank、@email等校验注解,否则运行时静默跳过;需在pom.xml中添加该starter依赖,dto加jsr-380注解并提供无参构造器,controller参数用@valid或@validated触发校验,配合@restcontrolleradvice统一处理异常返回友好json。

Spring Boot 2.5版本中,spring-boot-starter-validation不再默认包含在spring-boot-starter-web中,必须显式引入才能使用@NotBlank、@Email等Bean Validation注解,否则编译通过但运行时校验不生效,接口会静默跳过所有字段检查。
确认当前Spring Boot版本是否需要手动引入
打开pom.xml,查看spring-boot-starter-web的依赖树:执行mvn dependency:tree | grep validation。若无输出,说明未自动拉取校验模块——Spring Boot 2.5.0起已移除该传递依赖。
这一步不可跳过,2.4.x及更早版本默认带validation,2.5.x开始必须手动加。
添加spring-boot-starter-validation依赖
在pom.xml的<dependencies></dependencies>节内插入以下代码:
<dependency><br> <groupid>org.springframework.boot</groupid><br> <artifactid>spring-boot-starter-validation</artifactid><br></dependency>
【不要额外引入hibernate-validator或validation-api】——starter内部已封装完整实现,重复引入会导致注解冲突或@Valid失效。
定义DTO并添加校验注解
新建Java类UserRegisterDTO,字段上标注标准JSR-380注解:
import javax.validation.constraints.*;<br>public class UserRegisterDTO {<br> @NotBlank(message = "用户名不能为空")<br> private String username;<br><br> @Email(message = "邮箱格式不正确")<br> private String email;<br><br> @Min(value = 18) @Max(value = 120)<br> private Integer age;<br>// 必须提供getter,否则校验不触发<br>}
注意:Lombok的@Data会自动生成getter,但@AllArgsConstructor或@RequiredArgsConstructor不能省略无参构造器——@Valid要求对象可通过反射实例化。
在Controller中启用校验
方法一:RequestBody参数校验(最常用)
在@PostMapping方法参数前同时加@RequestBody和@Valid:
@PostMapping("/register")<br>public Result register(@RequestBody @Valid UserRegisterDTO dto) {<br> return Result.ok();<br>}
此时若字段不合法,Spring自动抛出MethodArgumentNotValidException,返回HTTP 400及错误详情。
方法二:RequestParam/PathVariable校验
需改用Spring专属@Validated,并在类上加@Validated:
@RestController<br>@Validated<br>public class UserController {<br> @GetMapping("/search")<br> public Result search(@Size(min = 1, max = 20) @RequestParam String keyword) {<br> return Result.ok();<br> }<br>}
这里@Size直接作用于@RequestParam参数,无需包装DTO——但仅限简单类型,复杂对象仍需DTO+@Valid。
统一捕获校验异常并返回友好提示
第一步:创建全局异常处理器类,添加@RestControllerAdvice注解。
第二步:编写处理MethodArgumentNotValidException的方法:
@ExceptionHandler(MethodArgumentNotValidException.class)<br>public Result handleValidationExceptions(MethodArgumentNotValidException ex) {<br> String defaultMessage = ex.getBindingResult().getFieldErrors().get(0).getDefaultMessage();<br> return Result.fail(defaultMessage);<br>}
第三步:确保该类被Spring扫描到——放在主启动类同包或子包下,无需额外配置。
这一步做完后,所有@Valid失败都会走这个处理器,前端收到的是结构化JSON错误,而不是原始HTML 400页面。











