升级Jackson Kotlin模块至2.18后遇反序列化错误:无委托/属性创建器
解决Jackson Kotlin 2.18版本反序列化Data Class失败问题
问题分析
将Jackson Kotlin模块从2.17升级到2.18后,Kotlin Data Class出现反序列化失败,报错cannot deserialize from Object value (no delegate- or property-based Creator),但2.17版本可正常运行。这是因为2.18版本对Kotlin构造函数的识别逻辑做了调整,或依赖、配置出现不一致导致的。
解决方案
1. 统一Jackson全模块版本
确保Jackson核心模块(jackson-databind、jackson-core、jackson-module-kotlin)使用完全一致的2.18.x版本,避免版本冲突引发功能异常。
Gradle示例:
dependencies { implementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.18.0") implementation("com.fasterxml.jackson.core:jackson-databind:2.18.0") implementation("com.fasterxml.jackson.core:jackson-core:2.18.0") }
Maven示例:
<dependencies> <dependency> <groupId>com.fasterxml.jackson.module</groupId> <artifactId>jackson-module-kotlin</artifactId> <version>2.18.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.18.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.18.0</version> </dependency> </dependencies>
2. 显式注册KotlinModule并配置构造函数识别
若手动配置Jackson ObjectMapper,需显式注册KotlinModule,确保Jackson能识别Kotlin Data Class的构造函数:
import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.module.kotlin.registerKotlinModule // 注册Kotlin模块 val objectMapper = ObjectMapper().registerKotlinModule()
如果是Spring Boot项目,可通过配置类确保模块注册:
import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.module.kotlin.registerKotlinModule @Configuration class JacksonConfig { @Bean fun objectMapper(): ObjectMapper { return ObjectMapper().registerKotlinModule() } }
3. 给Data Class参数添加@JsonProperty注解(备选)
若上述方法无效,可显式指定JSON字段与构造参数的映射:
import com.fasterxml.jackson.annotation.JsonProperty import jakarta.validation.constraints.NotEmpty import jakarta.validation.constraints.Size import java.io.Serializable data class StopWordModifyRequest( @field:NotEmpty @field:Size(min = 2, max = 255) @JsonProperty("word") val word: String, ) : Serializable
原因说明
Jackson 2.18版本优化了Kotlin反射处理逻辑,对构造函数的识别规则更严格。如果依赖版本不统一、KotlinModule未正确注册,就会导致Jackson无法自动识别Data Class的构造函数,从而抛出反序列化异常。
内容的提问来源于stack exchange,提问作者Hett
相关产品推荐
相关产品推荐

