Отказ от ответственности
Я знаю, что есть много сообщений с похожей проблемой, но ни одно решение не работает для меня. Я пытался со вчерашнего дня, и количество попыток, которые я пробовал, слишком много, чтобы перечислять их здесь. То, что я публикую, является последней попыткой.
Обзор
У меня есть служба, которая отправляет запрос в другую службу и должна полиморфно десериализовать ответ.
Классы
Это формат, который я получаю от остального вызова. Всего два свойства.
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
]
}
}
Привет @shidoro, я обновил свой ответ и изменил JSON. Пожалуйста, проверь это.
Я предполагаю, что проблема в том, что служба, которую я вызываю, не знает, какой тип ExecutionData она будет. Он знает только общий тип ExecutionPayload, который является типом NetworkConfiguration. Именно здесь я подумал, что смогу сопоставить его с любым подклассом ExecutionData. Моя ошибка заключалась в том, что я думал, что Джексон узнает правильный подтип, сравнивая полезные нагрузки. Во всяком случае, ваш ответ меня расстроил. У меня есть идея, что я могу сделать дальше. Большое спасибо, Жоао!
Великолепно! Я получил тип, но не в
ExecutionData
, вместо этого я получил его вExecutionPayload
. Есть ли способ, которым я могу аннотироватьExecutionPayload
, чтобы сказать Джексону: «Эй, вот тот тип, который тебе нужен, он на этом уровне, а не в ExecutionData»?