У меня есть следующий класс данных:
@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];