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

Kotlin Spring Boot项目中data class的Bean validation不生效问题

问题根本原因

你观察到的现象本质是Jackson反序列化步骤早于Bean校验步骤执行:
你定义的data class使用不可空类型val id: String作为主构造参数,Kotlin要求构造实例时必须传入该参数的非空值。当你提交{}的请求体时,Jackson在反序列化构造Test实例的阶段就会因为缺少非空构造参数直接抛出HttpMessageNotReadableException,请求流程根本没有走到后续的Bean校验逻辑,所以你添加的所有校验注解都不会生效。
你之前测试Java类、非data Kotlin类时校验正常,就是因为这类类默认提供无参构造,Jackson可以先实例化空对象,再通过setter注入属性,完成实例化后可以正常进入校验流程。


可用解决方案

方案1:调整字段为可空类型配合校验(最推荐)

该方案符合Kotlin代码规范,不需要修改全局配置,语义清晰:将data class的字段改为可空类型,让Jackson可以正常完成实例构造,后续Bean校验就可以正常触发@NotNull规则。

// 字段改为可空类型String?,@field:NotNull会在校验阶段拦截null值
data class Test(@field:NotNull val id: String?)

调整后再提交空请求体,会触发标准的MethodArgumentNotValidException校验异常,你可以通过全局异常捕获统一返回400参数错误。

方案2:开启构造函数校验

如果你不想将字段改为可空类型,可以开启校验框架的构造函数校验能力,让校验逻辑在实例构造阶段执行:

  1. 给data class添加@Validated注解,校验注解直接加在构造参数上
import org.springframework.validation.annotation.Validated
import javax.validation.constraints.NotNull

@Validated
data class Test(@NotNull val id: String)
  1. 确保Spring上下文中已经开启方法校验支持(Spring Boot 2.6引入spring-boot-starter-validation后默认开启)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 12:54:06