
Spring Boot 3.x 升级后因 Jakarta EE 迁移导致 @Pattern 等 Bean Validation 注解失效,需将 javax.validation.* 替换为 jakarta.validation.* 才能正常触发参数校验。
spring boot 3.x 升级后因 jakarta ee 迁移导致 `@pattern` 等 bean validation 注解失效,需将 `javax.validation.*` 替换为 `jakarta.validation.*` 才能正常触发参数校验。
在 Spring Boot 3.x(含 3.0+ 及最新 3.1.x、3.2.x)中,Spring 官方已全面迁移到 Jakarta EE 9+ 命名空间,所有 Java EE 标准包路径均从 javax.* 更改为 jakarta.*。这意味着原本依赖 javax.validation.Valid 和 javax.validation.constraints.Pattern 的校验逻辑将完全失效——即使添加了 @Validated 控制器注解和 @Pattern 参数注解,也不会触发任何验证,请求将无条件通过(如 name=abc 或 name=123456789 均被接受)。
✅ 正确做法是更新导入路径并确保依赖兼容:
1. 修改 Kotlin 类中的 import 语句:
import jakarta.validation.Valid // ✅ 替换 javax.validation.Valid
import jakarta.validation.constraints.Pattern // ✅ 替换 javax.validation.constraints.Pattern
import org.springframework.validation.annotation.Validated
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RequestParam
import org.springframework.web.bind.annotation.RestController
@RestController
@Validated
class HelloController {
@GetMapping("/hello")
fun getHello(
@Valid
@RequestParam("name")
@Pattern(regexp = "^[a-z]{4}$", message = "Name must be exactly 4 lowercase letters")
name: String
): String {
return "Hello $name!"
}
}
2. 确认 Maven/Gradle 依赖使用的是 Jakarta 版本:
Spring Boot 3.x 默认引入 spring-boot-starter-validation,其底层已基于 jakarta.validation:jakarta.validation-api(≥ 3.0.0),无需额外排除或强制指定——但请务必避免显式引入旧版 javax.validation:validation-api,否则可能引发类路径冲突。
3. 补充说明与最佳实践:
-
@Validated是 Spring 提供的扩展注解,支持分组校验;而@Valid(来自 Jakarta)用于触发嵌套对象或参数级校验,二者在此场景下需配合使用。 - 若仍不生效,请检查是否遗漏
@Validated在类级别(必须存在,否则方法级@Valid不生效)。 - 推荐为
@Pattern添加message属性,便于定位问题;同时可配合@NotBlank等组合使用,提升健壮性。 - 启动时可通过
--debug或日志级别设为DEBUG查看ValidationAutoConfiguration是否成功加载。
遵循以上调整后,非法请求(如 /hello?name=ab2c 或 /hello?name=abc)将立即返回 400 Bad Request 并附带详细校验错误信息,真正实现服务端输入防护。











