科特林杰克逊 "missing type id property 'type' (for POJO property 'data');"

Kotlin Jackson "missing type id property 'type' (for POJO property 'data');"

免责声明

我知道有很多帖子有类似的问题,但没有一个解决方案适合我。我从昨天开始就一直在尝试,我尝试的次数太多了,无法在此处列出。我发布的是最新的尝试。

概览

我有一个服务,它向另一个服务发送请求并需要多态反序列化响应。

这是我从休息电话中收到的格式。只有两个属性。

data class ExecutionPayload(
    val type: ChangeRequestType,
    val data: ExecutionData
)

ExecutionData是多态位

@JsonIgnoreProperties(ignoreUnknown = true)
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes(
    Type(value = UpdateNetworkConfigurationsExecutionData::class, name = "UpdateNetworkConfigurationsExecutionData")
)
sealed class ExecutionData


@JsonIgnoreProperties(ignoreUnknown = true)
data class UpdateNetworkConfigurationsExecutionData(
    @JsonProperty("type") val updatedProfiles: List<UpdateSalesChannelProfileViewModel>,
    @JsonProperty("type") val zoning: List<SoftZoningConfig>
) : ExecutionData()

详情

我将添加更多上下文,这对您来说可能很明显,但无论如何。

ExecutionData 将来会有与 UpdateNetworkConfigurationsExecutionData.

完全不同的数据结构的子类

愚蠢的例子

data class SomeOtherConfigurationUpdateExecutionData(
    val updateSomethingHere: String,
    val anotherPropertyUpdate: Int
    val anExtraProperty: List<SomeConfig>
) : ExecutionData()

问题

无论我怎么努力,我总是收到这个错误。

ERROR com.somepackage.utils.Logger - CustomErrorConfig - org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error:
Could not resolve subtype of [simple type, class com.somepackage.ExecutionData]: missing type id property 'type' (for POJO property 'data');
nested exception is com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Could not resolve subtype of [simple type, class com.somepackage.ExecutionData]:
missing type id property 'type' (for POJO property 'data')

非常感谢您的帮助。

P.S。我是科特林和杰克逊的新手。

你需要做的第一件事是删除不必要的@JsonProperty("type"):

@JsonIgnoreProperties(ignoreUnknown = true)
data class UpdateNetworkConfigurationsExecutionData(
    val updatedProfiles: List<UpdateSalesChannelProfileViewModel>,
    val zoning: List<SoftZoningConfig>
) : ExecutionData()

除此之外,请记住 type JSON 属性必须与 @Type name 属性匹配。这意味着它必须匹配 UpdateNetworkConfigurationsExecutionData。您的 JSON 必须类似于:

{
  "type": // ChangeRequestType,
  "data": {
      "type": "UpdateNetworkConfigurationsExecutionData",
      "updatedProfiles": [
          // UpdateSalesChannelProfileViewModel objects
      ],
      "zoning": [
          // SoftZoningConfig objects
      ]
  }
}