You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin:如何强制非空Long以非原生类型解决Spring Boot验证失效问题?

解决Kotlin非空Long导致@NotNull验证失效的问题

我之前在Spring Boot项目里也踩过这个坑!问题根源就是Kotlin的非空Long默认会被编译成JVM原生long类型——原生类型没法为null,所以当JSON请求里没传postId字段时,Jackson这类反序列化框架会自动把它设为0,直接绕过了@NotNull的校验,确实很头疼。

要解决这个问题,核心就是让Kotlin把这个非空的Long字段编译成JVM的包装类型java.lang.Long,这样缺失字段时就会得到null,触发校验逻辑。这里有个最简单直接的方法:

显式指定Java包装类型

把数据类里的Long替换成java.lang.Long,这样JVM层面就会用包装类型,不会自动填充默认值:

data class Comment(
    @field:NotNull
    val postId: java.lang.Long,
    // 其他字段...
)

另外补充个小知识点:Kotlin之所以默认用原生类型,是为了追求性能,但在和Java的Bean校验、序列化这类场景配合时,就会出现这种“不符合直觉”的问题。换成Java的包装类型后,既能保持Kotlin代码的非空语义(因为你还是用的val,而且加了@NotNull),又能让校验逻辑正常工作。

还有一种思路是调整Jackson的配置,让它对原生类型的缺失字段抛出异常,但相比之下,直接修改类型声明更简单直接,也更符合你想要的“强制非原生类型表示”的需求。

内容的提问来源于stack exchange,提问作者Teimuraz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:42:48