Kotlin数据类Long字段@NotNull校验失效问题排查与解决
解决Kotlin数据类中Long类型字段未传入时的校验问题
这个问题我之前也踩过坑,核心原因是Jackson Kotlin模块对非空基本类型的默认行为:当请求里缺失postId字段时,Jackson会自动给非空的Long类型参数填充默认值0,而@NotNull注解只校验值是否为null——0显然不是null,所以校验就“意外通过”了。
下面是两种靠谱的解决办法:
方法一:将字段改为可空类型并保留@NotNull
把postId的类型从Long改成Long?(可空类型),这样当请求中没有传入该字段时,Jackson会把它设为null,此时@NotNull就能正常触发校验了:
data class CreateCommentRequest( @field:NotNull @field:NotEmpty val comment: String, @field:NotNull val postId: Long? // 修改为可空类型 )
这种方式最直接,完全贴合你“字段未传入就校验失败”的需求——缺失字段会被解析为null,正好命中@NotNull的校验逻辑。
方法二:配置Jackson禁止为非空构造参数填充默认值
如果你不想修改字段的可空性,可以通过配置Jackson,让它在遇到缺失的构造参数时直接抛出异常(不再填充默认值),这样请求连进入校验环节都不会,直接返回400错误。
在application.properties中添加以下配置:
spring.jackson.deserialization.fail-on-missing-creator-properties=true
或者在application.yml中:
spring: jackson: deserialization: fail-on-missing-creator-properties: true
不过要注意,这个配置是全局生效的,会影响所有Kotlin数据类的反序列化行为,需要根据你的项目情况权衡使用。
另外别忘了:确保你的项目已经引入了spring-boot-starter-validation依赖,否则所有校验注解本身都不会生效。如果没加的话,在build.gradle中补充:
implementation 'org.springframework.boot:spring-boot-starter-validation'
或者pom.xml中:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
内容的提问来源于stack exchange,提问作者Teimuraz
相关产品推荐
相关产品推荐

