升级Spring Boot到2.5.4后Kotlin data class的@field:NotBlank失效如何解决
问题背景
现有技术栈为 JDK 14、Spring Boot 2.2.8.RELEASE、Kotlin 1.5.31,定义如下请求类,firstName或lastName为空时可正常触发校验抛出错误:
data class ChangeInformationRequest( @field:NotBlank var firstName: String, @field:NotBlank var lastName: String, @field:Valid var address: Address? )
升级到Spring Boot 2.5.4版本后,上述校验逻辑不再触发,未抛出预期错误。
问题成因
- 核心原因:Spring Boot 从2.3.0版本开始,将校验组件从
spring-boot-starter-web的默认依赖中移除,独立为单独的spring-boot-starter-validationstarter。升级到2.5.4版本后如果没有手动引入该依赖,所有校验逻辑默认不会生效。 - 次要排查点:若已引入校验依赖仍不生效,大概率是注解包名不兼容:Spring Boot 2.5.x仍使用Java EE规范的
javax.validation系列注解,若错误引入了Jakarta EE规范的jakarta.validation注解,会导致原有注解无法被校验组件识别。
解决方案
- 手动添加校验依赖
Maven配置示例:
Gradle配置示例:<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>implementation 'org.springframework.boot:spring-boot-starter-validation' - 校验注解包名一致性检查
确保请求类中所有校验注解的包名是javax.validation.constraints.NotBlank,而非jakarta.validation.constraints.NotBlank,你当前代码中使用的@field:NotBlank前缀无需修改,该前缀是Kotlin场景下让注解作用在类字段上的必要写法,符合要求。 - Controller层校验触发检查
确认接收ChangeInformationRequest参数的接口方法上,参数前标注了@Valid或@Validated注解,分组校验场景还需要在Controller类上补充@Validated注解。
内容的提问来源于stack exchange,提问作者die Wolken
相关产品推荐
相关产品推荐

