Spring @RequestBody, содержащий список разных типов (но тот же интерфейс)
Скажем, что у меня есть класс домена:
public class Zoo{
private List<Animal> animals;
....
где Animal - это интерфейс с различными реализациями (Cat, Dog). Скажем, что я хочу сохранить объект Zoo:
@RequestMapping(value = "/zoo", method = RequestMethod.POST)
public @ResponseBody void save(@RequestBody Zoo zoo) {
....
и я хочу отправить json - что-то вроде:
{
animals:[
{type:'Cat', whiskers-length:'3'},
{type:'Dog', name:'Fancy'}
]
}
Как я могу показать spring MVC для сопоставления животного с типом Cat, когда type == 'Cat' и сопоставить его с классом Dog, когда type == 'Dog'?
Ответы
Ответ 1
Вы должны использовать аннотации Jackson @JsonTypeInfo
и @JsonSubTypes
для достижения полиморфного json. Аннотации переходят к базовому классу Animal
.
@JsonTypeInfo(use = Id.NAME, include = As.PROPERTY, property = "type")
@JsonSubTypes({@JsonSubTypes.Type(value = Dog.class, name = "Dog"),
@JsonSubTypes.Type(value = Cat.class, name = "Cat")})
public abstract class Animal {
}
Ответ 2
Теперь есть более простая аннотация:
@JsonRootName("dog")
public class Dog extends Animal {...}
Ссылка на аннотацию можно найти на fasterxml.github