Котлин Джексон «отсутствует свойство идентификатора типа« тип »(для свойства POJO« данные »);»

Отказ от ответственности

Я знаю, что есть много сообщений с похожей проблемой, но ни одно решение не работает для меня. Я пытался со вчерашнего дня, и количество попыток, которые я пробовал, слишком много, чтобы перечислять их здесь. То, что я публикую, является последней попыткой.

Обзор

У меня есть служба, которая отправляет запрос в другую службу и должна полиморфно десериализовать ответ.

Классы

Это формат, который я получаю от остального вызова. Всего два свойства.

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. Я новичок в Котлине и Джексоне.

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
0
24
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Первое, что вам нужно сделать, это удалить ненужные @JsonProperty("type"):

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

Кроме того, имейте в виду, что атрибут type JSON должен соответствовать атрибуту @Typename. Это означает, что он должен соответствовать UpdateNetworkConfigurationsExecutionData. Ваш JSON должен быть похож на:

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

Великолепно! Я получил тип, но не в ExecutionData, вместо этого я получил его в ExecutionPayload. Есть ли способ, которым я могу аннотировать ExecutionPayload, чтобы сказать Джексону: «Эй, вот тот тип, который тебе нужен, он на этом уровне, а не в ExecutionData»?

shidoro 09.04.2022 14:14

Привет @shidoro, я обновил свой ответ и изменил JSON. Пожалуйста, проверь это.

João Dias 09.04.2022 14:30

Я предполагаю, что проблема в том, что служба, которую я вызываю, не знает, какой тип ExecutionData она будет. Он знает только общий тип ExecutionPayload, который является типом NetworkConfiguration. Именно здесь я подумал, что смогу сопоставить его с любым подклассом ExecutionData. Моя ошибка заключалась в том, что я думал, что Джексон узнает правильный подтип, сравнивая полезные нагрузки. Во всяком случае, ваш ответ меня расстроил. У меня есть идея, что я могу сделать дальше. Большое спасибо, Жоао!

shidoro 09.04.2022 14:39

Другие вопросы по теме