- AbstractParent является абстрактным классом верхнего уровня.
- AbstractChild расширяет абстрактный PPARENT (1..n Subclass). реализации).
- использует key1 для определения правильного AbstractChild subtype.
Код: Выделить всё
AbstractParent
- использует key2 для определения правильного ConceteObj .
Код: Выделить всё
AbstractChild
Abstract Parent
Код: Выделить всё
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "key1")
@JsonSubTypes({
@JsonSubTypes.Type(value = AbstractChildA.class, name = "CHILD_A"),
@JsonSubTypes.Type(value = AbstractChildB.class, name = "CHILD_B")
})
public abstract class AbstractParent {
private String key1;
public AbstractParent() {}
public AbstractParent(String key1) {
this.key1 = key1;
}
}
< /code>
абстрактный ребенок < /h3>
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "key2")
@JsonSubTypes({
@JsonSubTypes.Type(value = ConcreteObjX.class, name = "CONCRETE_X"),
@JsonSubTypes.Type(value = ConcreteObjY.class, name = "CONCRETE_Y")
})
public abstract class AbstractChild extends AbstractParent {
private String key2;
public AbstractChild() {}
public AbstractChild(String key1, String key2) {
super(key1);
this.key2 = key2;
}
}
< /code>
Concrete Class < /h3>
public class ConcreteObjX extends AbstractChild {
private String someProperty;
public ConcreteObjX() {}
public ConcreteObjX(String key1, String key2, String someProperty) {
super(key1, key2);
this.someProperty = someProperty;
}
}
< /code>
json input < /h2>
{
"key1": "CHILD_A",
"key2": "CONCRETE_X",
"someProperty": "test-value"
}
< /code>
Выпуск < /h2>
Джексон не удается десериализировать эту структуру и бросает следующую ошибку: < /p>
com.fasterxml.jackson.databind.exc.InvalidDefinitionException:
Cannot construct instance of `AbstractChild`
(no Creators, like default constructor, exist):
abstract types either need to be mapped to concrete types, have a custom deserializer, or contain additional type information.
[*] Обеспечить, что оба абстрактных класса имеют @jsontypeinfo и @jsonsubtypes .
[*] подтвердили, что ConcreteObjx правильно зарегистрирован . конструкторы по умолчанию во всех абстрактных и конкретных классах.
[*] Попытка с использованием Deserializer , но все еще не проходит. Аннотация класса имеет свой собственный ключ для дискриминатора ?
Потребуется ли Custom Deserializer , или есть способ заставить Джексона справиться с этим из коробки? @Jsonsubtypes. < /P>
< /li>
проверил, что ConcreteObjx правильно зарегистрирован в AbstractChild. но это все еще терпит неудачу.
Подробнее здесь: https://stackoverflow.com/questions/794 ... ract-class