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
相关产品推荐
相关产品推荐

