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

Kotlin与Spring Boot请求体验证:请求体反序列化400错误求助

解决Kotlin + Spring Boot JSON反序列化的HTTP 400错误

这个问题我碰到过好多次了,本质上是Jackson没法正确实例化你的Kotlin数据类导致的。Kotlin数据类默认生成的主构造函数是带参数的,而Jackson默认会尝试调用无参构造函数,找不到就会抛出你看到的那个JsonMappingException。下面给你几个靠谱的解决方案:

方案1:给数据类添加无参构造函数(最简单直接)

你可以给数据类的所有参数设置默认值,这样Kotlin会自动生成一个无参构造函数,Jackson就能顺利实例化对象了:

data class User(
    val id: Long = 0,
    val username: String = "",
    val email: String = ""
)

或者显式声明无参构造函数(不过这种方式需要给所有属性重新赋值,不如默认值方便):

data class User(val id: Long, val username: String, val email: String) {
    constructor() : this(0, "", "")
}

方案2:启用Jackson Kotlin模块(推荐,更符合Kotlin风格)

Spring Boot其实已经集成了jackson-module-kotlin,这个模块专门用来解决Kotlin和Jackson的兼容性问题,它能让Jackson直接识别Kotlin数据类的主构造函数,不需要额外的无参构造。

首先确保你的依赖里包含这个模块:

  • Maven:
<dependency>
    <groupId>com.fasterxml.jackson.module</groupId>
    <artifactId>jackson-module-kotlin</artifactId>
</dependency>
  • Gradle:
implementation 'com.fasterxml.jackson.module:jackson-module-kotlin'

之后你只需要正常定义数据类就行,不需要额外修改:

data class User(val id: Long, val username: String, val email: String)

Spring Boot会自动配置ObjectMapper并注册这个模块,Jackson就能正确反序列化了。

如果你的项目里自定义了ObjectMapper,记得手动注册KotlinModule:

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

@Configuration
class JacksonConfig {
    @Bean
    fun objectMapper(): ObjectMapper {
        return ObjectMapper().registerModule(KotlinModule())
    }
}

方案3:使用@JsonCreator注解(适合特殊场景)

如果不想用默认值也不想依赖Kotlin模块,可以在数据类的主构造函数上添加@JsonCreator注解,并给每个参数加上@JsonProperty指定字段名:

import com.fasterxml.jackson.annotation.JsonCreator
import com.fasterxml.jackson.annotation.JsonProperty

data class User @JsonCreator constructor(
    @JsonProperty("id") val id: Long,
    @JsonProperty("username") val username: String,
    @JsonProperty("email") val email: String
)

这样Jackson就明确知道要用这个带参数的构造函数来创建对象了。

总结一下

优先用方案2,它最符合Kotlin的编码习惯,也不需要额外修改数据类结构。如果是简单场景,方案1也能快速解决问题。方案3适合一些需要精确控制反序列化逻辑的特殊情况。

内容的提问来源于stack exchange,提问作者Miguel Anciães

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:35:23