17370845950

如何在 Spring Boot 3.x 中正确导入 @NotBlank 注解

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):

  1. 确保 pom.xml 中已引入验证启动器(你已正确配置):

    
     org.springframework.boot
     spring-boot-starter-validation
    

    该 starter 会自动传递依赖 jakarta.validation:jakarta.validation-api(而非旧版 javax.validation:validation-api)。

  2. 在 Java 类中使用以下 import 语句(注意是 jakarta,不是 javax):

    import jakarta.validation.constraints.NotBlank; // ✅ 正确(Spring Boot 3.x)
  3. 修改你的 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 即可开箱即用。