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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:36:28