2013-06-22 17 views
14

ı bir alan sınıf olduğunu varsayalım: bir hayvan, farklı uygulamaları (kedi, köpek) olan bir arabirimfarklı türde (ancak aynı arayüzü) bir listesini ihtiva eden Spring @RequestBody

public class Zoo{ 
     private List<Animal> animals; 
     .... 

. ı bir Hayvanat bahçesi nesneyi kaydetmek mümkün istiyorum varsayalım:

@RequestMapping(value = "/zoo", method = RequestMethod.POST) 
    public @ResponseBody void save(@RequestBody Zoo zoo) { 
    .... 

ve ben bir json göndermek istiyorum - gibi bir şey:

{ 
     animals:[ 
      {type:'Cat', whiskers-length:'3'}, 
      {type:'Dog', name:'Fancy'} 
     ] 
    } 

nasıl bahar MVC Cat hayvanı haritaya söyleyebilir type == 'Cat' yazın ve type == 'Dog' iken bir Dog sınıfına eşlemek için?

+0

Maalesef bulunabilir. Ama yine de sorunumu çözmüyor, bu da json nesnesinden {type: 'Cat', whiskersLength: '3'} Cat sınıfına eşleştiriliyor. Hayvanat bahçesi sınıfı sadece hayvanların listesi hayvanların içerdiğini bilir. Fakat json sökücü, Hayvan arabiriminin (Dog veya Cat) hangi json nesnesini kullanacağını nasıl bilir? –

cevap

15

Sen polimorfik json elde etmek Jackson açıklamaları @JsonTypeInfo ve @JsonSubTypes kullanmalıdır. Ek açıklamalar, Animal temel sınıfına gider.

@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 { 

} 
+0

Bu işe yarıyor! Çok teşekkür ederim! –

+3

Bu, 2 alt türü (Kediler ve Köpekler) için harika görünüyor, ancak büyük bir alt tür listesi varsa ne olur? Hayvanat bahçesinde daha çok hayvan türü vardır :) – Wouter

+1

, hayvana '@ JsonSubTypes 'koymadan Kedi ya da Köpek üzerine bir açıklama koymanın herhangi bir yolu mu? – dmitryvim

3

daha basit bir açıklama şimdi Orada dışarı:

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

açıklama referans geçersiz json ile karışıklık için fasterxml.github

İlgili konular