Скажем, у меня есть обычный Animal, Cat расширяет Animal, Dog расширяет полиморфный пример Animal в Джексоне, используя @type для различения подтипов:
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY)
@JsonSubTypes({
@JsonSubTypes.Type(value = Cat.class, name = "cat"),
@JsonSubTypes.Type(value = Dog.class, name = "dog")
})
public abstract class Animal {
...
}
public class Cat extends Animal {
...
}
public class Dog extends Animal {
...
}
Я использую это в Spring Boot REST API.
Теперь я хочу десериализовать Cat из строки JSON, в которой нет @type. Я знаю, что это Cat, потому что это все, что принимает этот конкретный вызов REST API. Как я могу заставить Джексона десериализовать этот JSON как Cat, чтобы он не жаловался на отсутствие поля "@type"?
Я знаю, что могу включить @JsonTypeInfo(use = JsonTypeInfo.Id.NONE)
в класс Cat, но тогда, когда я сериализую Cats, у меня не будет поля @type, которое я все еще хочу.
Нужно ли предоставлять собственный десериализатор? Могу ли я сделать это для метода с одним контроллером?