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
相关产品推荐
相关产品推荐

