2013-06-22 10 views
14

Diciamo che ho una classe di dominio:Primavera @RequestBody contenente un elenco di diversi tipi (ma stessa interfaccia)

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

in cui un animale è un'interfaccia con diverse implementazioni (gatto, cane). Diciamo che voglio essere in grado di salvare un oggetto Zoo:

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

e voglio inviare un JSON - qualcosa come:

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

Come posso dire a Spring MVC per mappare animali a Cat scrivi quando scrivi == 'Cat' e mappalo a una classe Dog quando scrivi == 'Dog'?

+0

Ci scusiamo per la confusione con JSON valido. Ma ancora non risolve il mio problema, che è la mappatura dall'oggetto json {type: 'Cat', whiskersLength: '3'} alla classe Cat. La classe Zoo sa solo che la lista degli animali contiene animali. Ma come fa il deserializzatore JSON a sapere quale implementazione dell'interfaccia Animal (Cane o Gatto) utilizzare per un oggetto json specifico? –

risposta

15

È necessario utilizzare le annotazioni Jackson @JsonTypeInfo e @JsonSubTypes per ottenere risultati polimorfi. Le annotazioni vanno sulla classe base 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 { 

} 
+0

Funziona! Grazie mille! –

+3

Questo sembra ottimo per 2 sottotipi (gatti e cani), ma cosa succede se si dispone di un enorme elenco di sottotipi? Ci sono più tipi di animali in uno zoo :) – Wouter

+1

è un modo per mettere qualche annotazione su Gatto o Cane, senza inserire '@ JsonSubTypes' su animale? – dmitryvim

3

C'è un'annotazione semplice fuori adesso:

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

Il riferimento l'annotazione può essere trovato su fasterxml.github

Problemi correlati