Kotlin中Jackson多态反序列化报错‘missing type id property 'type' (for POJO property 'data')’求助
解决Jackson多态反序列化"missing type id property 'type'"错误
我完全理解你折腾了这么久都没解决的挫败感,咱们直接揪出问题核心,一步步修复:
核心问题分析
你的代码里有两个关键错误,直接导致了这个报错:
- 子类里错误的
@JsonProperty("type")注解,破坏了Jackson的多态类型识别逻辑 - 可能忽略了
data对象必须包含类型标识字段的要求
修复步骤
1. 修正子类的注解错误
你在UpdateNetworkConfigurationsExecutionData里给两个字段都加了@JsonProperty("type"),这完全是错误的——这会让Jackson把两个字段都映射到JSON里的type属性,不仅会导致数据混乱,还直接覆盖了父类ExecutionData用来区分子类的类型ID字段,这就是报错的主要原因。
把错误注解删掉,让字段名和JSON对应字段保持一致:
@JsonIgnoreProperties(ignoreUnknown = true) data class UpdateNetworkConfigurationsExecutionData( val updatedProfiles: List<UpdateSalesChannelProfileViewModel>, val zoning: List<SoftZoningConfig> ) : ExecutionData()
2. 确保父类的多态配置完整
后续添加新的ExecutionData子类时,必须在父类的@JsonSubTypes里注册对应的类型,比如添加SomeOtherConfigurationUpdateExecutionData后:
@JsonIgnoreProperties(ignoreUnknown = true) @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type") @JsonSubTypes( Type(value = UpdateNetworkConfigurationsExecutionData::class, name = "UpdateNetworkConfigurationsExecutionData"), Type(value = SomeOtherConfigurationUpdateExecutionData::class, name = "SomeOtherConfigurationUpdateExecutionData") ) sealed class ExecutionData
3. 验证传入的JSON结构
你的响应JSON必须符合以下格式,尤其是data对象里的type字段不能少,这个字段是Jackson识别子类的关键:
{ "type": "你的ChangeRequestType枚举值", "data": { "type": "UpdateNetworkConfigurationsExecutionData", "updatedProfiles": [...], "zoning": [...] } }
4. 检查枚举的序列化配置
确保ChangeRequestType枚举能被Jackson正确序列化/反序列化,如果枚举值和JSON字符串不匹配,可以给枚举添加@JsonValue或者@JsonProperty指定映射关系。
为什么之前的尝试都失败?
你之前的子类注解错误直接破坏了Jackson的多态识别逻辑,它找不到用来区分子类的type属性(被错误映射覆盖了),所以无论调整其他配置,核心问题没解决就会一直报错。
内容的提问来源于stack exchange,提问作者shidoro
相关产品推荐
相关产品推荐

