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

Kotlin data class带默认值字段Spring POST接口JSON解析丢失传入值问题

问题原因

该问题是Spring Boot 内置Jackson反序列化器未正确适配Kotlin data类特性导致的,具体逻辑如下:

  • Jackson默认不支持Kotlin专属的语法特性,包括data类构造参数默认值、val字段无setter、参数名称绑定等。如果项目未引入jackson-module-kotlin依赖,Jackson反序列化时会尝试调用无参构造生成实例,后续无法给无setter的val字段赋值,最终就保留了构造时的默认值,覆盖了JSON传入的参数。
  • 你手动调用jacksonObjectMapper().readValue()能正常解析的原因是:jacksonObjectMapper()是Kotlin Jackson模块提供的扩展方法,默认已经注册了Kotlin专属的解析模块,能正确识别构造参数默认值、完成参数绑定,所以可以拿到JSON传入的值。
解决方案

不需要手动解析原始JSON,按以下步骤配置即可恢复正常的@RequestBody参数绑定:

  1. 引入Kotlin Jackson模块依赖
    Gradle(Kotlin DSL)配置:
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")

Maven配置:

<dependency>
    <groupId>com.fasterxml.jackson.module</groupId>
    <artifactId>jackson-module-kotlin</artifactId>
</dependency>

Spring Boot 2.7及以上版本会自动管理该依赖的版本,无需手动指定版本号。
2. (可选,低版本Spring Boot需配置)注册Kotlin模块到Spring上下文
Spring Boot高版本引入依赖后会自动完成Kotlin模块的注册,低版本可以手动注入Bean开启支持:

import com.fasterxml.jackson.module.kotlin.KotlinModule
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration

@Configuration
class JacksonConfig {
    @Bean
    fun kotlinModule() = KotlinModule.Builder().build()
}

配置完成后,你原本直接用@RequestBody toUpdate: Category接收参数的接口就可以正常工作,JSON传入的type值会正确覆盖默认值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 00:54:08