Можно ли использовать несколько @JsonSubType
аннотаций во вложенном виде?
Например, представьте следующие классы:
@Data
@JsonSubTypeInfo(include=As.EXISTING_PROPERTY, property="species", use=Id.NAME, visible=true)
@JsonSubTypes({
@Type(name="Dog", value=Dog.class)
@Type(name="Cat", value=Cat.class)
})
public abstract class Animal {
private String name;
private String species;
}
@Data
@JsonSubTypeInfo(include=As.EXISTING_PROPERTY, property="breed", use=Id.NAME, visible=true)
@JsonSubTypes({
@Type(name="Labrador", value=Labrador.class)
@Type(name="Bulldog", value=Bulldog.class)
})
public abstract class Dog extends Animal {
private String breed;
}
@Data
public class Cat extends Animal {
private boolean lovesCatnip;
}
@Data
public class Labrador extends Dog {
private String color;
}
@Data
public class Bulldog extends Dog {
private String type; // "frenchy", "english", etc..
}
Если я использую объектное сопоставление, я могу успешно сопоставить Bulldog
с JSON, однако, при попытке прочитать результирующий JSON и прочитать его обратно, я получаю ошибку, подобную следующей:
Can not construct instance of com.example.Dog abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information
Возможно ли заставить Джексона работать с таким подтипом? Нужно ли создавать собственный десериализатор для каждого подкласса?
EDIT :
Я немного изменил приведенные выше классы по сравнению с исходной публикацией. Я добавил класс Cat
и получил его и Dog
от Animal
.
Вот пример JSON, который можно создать с помощью ObjectMapper::writeValueAsString
:
{
"name": null,
"species": "Dog",
"breed": "Bulldog",
"type": "B-Dog"
}