Spring @RequestBody, содержащий список разных типов (но тот же интерфейс) - программирование
Подтвердить что ты не робот

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'?

4b9b3361

Ответ 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