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

Jackson反序列化Kotlin密封类AudioItem子类时构造实例失败问题

Jackson Kotlin密封类反序列化报错解决方案

错误核心原因

Jackson在执行convertValue转换泛型集合时,受JVM类型擦除影响,默认无法识别List<AudioItem>的元素泛型信息,无法触发AudioItem上配置的@JsonSubTypes子类匹配逻辑,直接尝试实例化抽象类AudioItem导致报错。

具体解决步骤

  • 第一步:传入TypeReference显式声明泛型类型
    修改转换代码,通过TypeReference传递完整的泛型类型信息,代码如下:
import com.fasterxml.jackson.core.type.TypeReference

val audio: List<AudioItem> = ObjectMapper()
    .findAndRegisterModules()
    .convertValue(a, object : TypeReference<List<AudioItem>>() {})
  • 第二步:确保引入Jackson Kotlin模块
    Jackson默认不支持Kotlin类构造器参数注入,需要显式引入Kotlin适配模块,Gradle依赖配置参考:
implementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.15.2") // 替换为对应Jackson版本号

Maven依赖配置参考:

<dependency>
    <groupId>com.fasterxml.jackson.module</groupId>
    <artifactId>jackson-module-kotlin</artifactId>
    <version>2.15.2</version>
</dependency>
  • 第三步:校验源数据格式
    确保待转换的集合中每个LinkedHashMap元素都包含type字段,且字段值为Speech或Audio,与@JsonSubTypes中配置的name一致,缺失type字段也会触发该报错。

可选优化

密封类子类中可以去掉显式声明的type属性,@JsonTypeInfo会自动完成类型字段的读取匹配,无需在类属性中重复定义,避免字段赋值冲突:

data class Speech(val contentType: String = "SSML", val content: String) : AudioItem()
data class Audio(val source: String) : AudioItem()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 08:45:04