Spring Boot 3.0.1无法找到@NotBlank等校验注解的解决求助
Spring Boot 3.0.1 校验注解问题解决指南
核心原因:注解包路径迁移
Spring Boot 3.0基于Jakarta EE规范,不再沿用Java EE的javax包体系。你要找的@NotBlank、@NotNull、@NotEmpty这些校验注解,已经从javax.validation.constraints迁移到了jakarta.validation.constraints包下——不是Spring Boot移除了它们,只是导入路径变了。
依赖简化:只保留必要的starter
你的build.gradle里已经添加了spring-boot-starter-validation,这个starter已经自动包含了适配Jakarta的Hibernate Validator 8.x,以及必要的EL依赖。之前手动添加的hibernate-validator、hibernate-validator-cdi等零散依赖都是多余的,直接删掉即可。
最终只需保留这一行依赖:
implementation 'org.springframework.boot:spring-boot-starter-validation'
实现校验的完整步骤
1. 实体类添加校验注解
确保导入的是Jakarta包下的注解:
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; public class User { @NotNull(message = "用户ID不能为空") private Long id; @NotBlank(message = "用户名不能为空") @Size(min = 2, max = 20, message = "用户名长度需在2-20之间") private String username; // getter、setter方法省略 }
2. Controller触发校验
在接收实体参数的方法上添加@Valid或@Validated注解,触发校验逻辑:
import jakarta.validation.Valid; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @RestController public class UserController { @PostMapping("/users") public String createUser(@Valid @RequestBody User user) { // 执行业务逻辑 return "用户创建成功"; } }
3. 统一处理校验异常(可选)
通过全局异常处理器返回标准化的错误信息:
import jakarta.validation.ConstraintViolationException; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.validation.BindException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import java.util.HashMap; import java.util.Map; @RestControllerAdvice public class GlobalExceptionHandler { // 处理请求体绑定校验异常 @ExceptionHandler(BindException.class) public ResponseEntity<Map<String, String>> handleBindException(BindException e) { Map<String, String> errors = new HashMap<>(); e.getBindingResult().getFieldErrors().forEach(error -> errors.put(error.getField(), error.getDefaultMessage()) ); return new ResponseEntity<>(errors, HttpStatus.BAD_REQUEST); } // 处理其他校验异常 @ExceptionHandler(ConstraintViolationException.class) public ResponseEntity<Map<String, String>> handleConstraintViolationException(ConstraintViolationException e) { Map<String, String> errors = new HashMap<>(); e.getConstraintViolations().forEach(violation -> errors.put(violation.getPropertyPath().toString(), violation.getMessage()) ); return new ResponseEntity<>(errors, HttpStatus.BAD_REQUEST); } }
关于GlassFish Expressly依赖的说明
Hibernate文档提到的expressly依赖,Spring Boot的validation starter已经通过传递依赖引入了对应的Jakarta EL实现(如org.glassfish:jakarta.el),不需要手动添加,直接使用starter即可。
内容的提问来源于stack exchange,提问作者M Nouman
相关产品推荐
相关产品推荐

