복붙노트

[SPRING] Spring @RequestBody - 다른 유형의 목록을 포함하지만 (동일한 인터페이스)

SPRING

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'}
        ]
    }

타입 == 'Cat'일 때 동물을 Cat 타입으로 매핑하고, 타입 == 'Dog'일 때 Dog 클래스로 매핑하도록 봄 MVC에 어떻게 말할 수 있습니까?

해결법

  1. ==============================

    1.polymorphic json을 얻으려면 Jackson 주석 @JsonTypeInfo와 @JsonSubTypes를 사용해야합니다. 주석은 Animal 기본 클래스로 이동합니다.

    polymorphic json을 얻으려면 Jackson 주석 @JsonTypeInfo와 @JsonSubTypes를 사용해야합니다. 주석은 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. ==============================

    2.지금 간단한 주석이 있습니다.

    지금 간단한 주석이 있습니다.

    @JsonRootName("dog")
    public class Dog extends Animal {...}
    

    주석에 대한 참조는 fasterxml.github에서 찾을 수 있습니다.

  3. from https://stackoverflow.com/questions/17247189/spring-requestbody-containing-a-list-of-different-types-but-same-interface by cc-by-sa and MIT license