
spring boot 3.x 基于 jakarta ee 9+ 规范,已将验证注解从 `javax.validation` 迁移至 `jakarta.validation`,需使用 `import jakarta.validation.constraints.notblank;` 才能正确编译。
在 Spring Boot 3.0 及更高版本(如你使用的 3.0.2)中,由于全面拥抱 Jakarta EE 9+ 标准,所有 Java EE 相关的包名均已从 javax.* 升级为 jakarta.*。这意味着包括 @NotBlank、@NotNull、@Size 等 Bean Validation 注解,不再位于 javax.validation.constraints 下,而是位于 jakarta.validation.constraints 包中。
✅ 正确做法(适配 Spring Boot 3.x + Java 17):
-
确保 pom.xml 中已引入验证启动器(你已正确配置):
org.springframework.boot spring-boot-starter-validation 该 starter 会自动传递依赖 jakarta.validation:jakarta.validation-api(而非旧版 javax.validation:validation-api)。
-
在 Java 类中使用以下 import 语句(注意是 jakarta,不是 javax):
import jakarta.validation.constraints.NotBlank; // ✅ 正确(Spring Boot 3.x)
-
修改你的 Person 类如下:
package com.example.demo.model;
import com.fasterxml.jackson.annotation.JsonProperty; import jakarta.validation.constraints.NotBlank; // ← 关键修改:替换为 jakarta import java.util.UUID;
public class Person { private final UUID id;
@NotBlank(message = "Name must not be blank") // 可选:添加自定义提示
private final String name;
public Person(@JsonProperty("id") UUID id,
@JsonProperty("name") String name) {
this.id = id;
this.name = name;
}
public UUID getId() {
return id;
}
public String getName() {
return name;
}}
⚠️ 注意事项:
- 若仍使用 `import javax.validation.constraints.NotBlank;`,编译时会报错 `cannot find symbol @NotBlank` —— 因为该类在 Jakarta 版本中已彻底移除。
- 不建议降级 Spring Boot 版本(如退回 2.7.x)来迁就 `javax` 包,这会放弃 Spring Boot 3 的诸多新特性(如 GraalVM 原生镜像支持、HTTP/3、改进的 Actuator 等),且违背长期维护趋势。
- `spring-boot-starter-validation` 是必须的:它不仅提供 API,还默认集成 Hibernate Validator(Jakarta 兼容实现)作为运行时校验器。若缺少该依赖,即使 import 正确,运行时也不会触发校验逻辑。
- 若需在 Controller 层启用校验,别忘了在方法参数上添加 `@Valid`:
```java
@PostMapping("/persons")
public ResponseEntity> createPerson(@Valid @RequestBody Person person) {
// ...
}? 小结:
Spring Boot 3.x 的包迁移是 Jakarta EE 标准演进的必然结果。牢记一个口诀:“3.x → jakarta,2.x → javax”。只要确保依赖引入正确、import 路径准确、Controller 参数标注 @Valid,@NotBlank 即可开箱即用。










