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参数绑定:
- 引入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
相关产品推荐
相关产品推荐

