Проблема отображения Джексона для класса Enum через интерфейс - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть следующий класс данных:

@Json
data class ControlTag(val tagSource: TagSource, val tag: TagType)

Класс TagSource:

@Json
enum class TagSource {

  EXISTING, USER
}

TagType - это интерфейс:

interface TagType {
  fun getLabel(): String
  fun getValue(): String
}

У меня есть несколько перечислений классы, использующие этот интерфейс TagType:

enum class TagInformation : TagType {
  TAG_INFO_YES {
    override fun getLabel(): String {
      return "Tag Info - Yes"
    }

    override fun getValue(): String {
      return "t"
    }
  },
  TAG_INFO_NO {
    override fun getLabel(): String {
      return "Tag Info - No"
    }

    override fun getValue(): String {
      return "f"
    }
  };

  @JsonValue
  fun value(): String {
    return getLabel()
  }
}

Все хорошо на стороне сервера, но когда я звоню из пользовательского интерфейса, это дает ошибку Джексона:

[
....
{tagSource: "EXISTING", tag: "Tag Info - Yes"}
{tagSource: "USER", tag: "X Enum Info - No"}
{tagSource: "EXISTING", tag: "Y Enum Info - Yes"}
....
]

com.faster xml .jackson.databind.ex c .InvalidDefinitionException: невозможно создать экземпляр ...control_tag.TagType (создатели, такие как конструкция по умолчанию, не существуют): абстрактные типы либо должны быть сопоставлены с конкретными типами, либо иметь собственный десериализатор, либо содержать дополнительный тип информация в [Source: (PushbackInputStream); строка: 1, столбец: 378] (через цепочку ссылок:

Я исправил вышеуказанную проблему с добавлением ниже

@JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME,
    include = JsonTypeInfo.As.PROPERTY,
    property = "type")
@JsonSubTypes(
    JsonSubTypes.Type(value = TagInformation ::class, name = "TagInformation ")
)
interface TagType {

Но теперь у меня проблема с отображением:

{ tagSource: 'EXISTING', tag: { type: 'TagInformation', value: 'Tag - Yes' } }

Ошибка:

2020-04-24 18: 10: 50.147 WARN 26184 --- [nio-8093-exe c -5] .wsmsDefaultHandlerExceptionResolver: Resolved [org .springframework.http.converter.HttpMessageNotReadableException: Invalid JSON input: Невозможно десериализовать значение типа .control_tag.TagInformation из String "value": ни одно из значений, принятых для класса Enum: [Tag - Yes, Tag - No];

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...