2014-11-27 17 views
14

Supponiamo di avere tre classi.Spring @ReponseBody @RequestBody con classe astratta

public abstract class Animal {} 

public class Cat extends Animal {} 

public class Dog extends Animal {} 

Posso fare qualcosa di simile?

ingresso: un JSON, che è cane o gatto

uscita: un cane/gatto dipende dal tipo di oggetto d'ingresso

Non capisco perché il seguente codice di lavoro pretende molto. O dovrei usare due metodi separati per gestire nuovi cani e gatti?

@RequestMapping(value = "/animal", method = RequestMethod.POST, produces = "application/json; charset=utf-8") 
private @ResponseBody <T extends Animal>T insertAnimal(@RequestBody T animal) { 
    return animal; 
} 

Aggiornamento: SRY ho dimenticato di includere il messaggio di errore

stato HTTP 500 - Richiesta di trasformazione non è riuscita; l'eccezione annidata è java.lang.IllegalArgumentException: Tipo variabile 'T' non può essere risolto

+2

Cosa intendi con "il codice non funziona". Errore di runtime? Errore del compilatore? Dov'è il registro degli errori? Devi aiutarci a capire il problema. Grazie. –

risposta

24

ref link

Ho appena trovato la risposta me stesso e qui è il link di riferimento.

Quello che ho fatto è aggiunto un certo codice di sopra della classe astratta

import com.fasterxml.jackson.annotation.JsonSubTypes; 
import com.fasterxml.jackson.annotation.JsonTypeInfo; 
import com.fasterxml.jackson.annotation.JsonTypeInfo.*; 

@JsonTypeInfo(use = Id.NAME, include = As.PROPERTY, property = "type") 
@JsonSubTypes({ 
    @JsonSubTypes.Type(value = Cat.class, name = "cat"), 
    @JsonSubTypes.Type(value = Dog.class, name = "dog") 
}) 
public abstract class Animal{} 

Poi nell'input JSON in HTML,

var inputjson = { 
    "type":"cat", 
    //blablabla 
}; 

Dopo la presentazione della JSON e, infine, nel controller,

@RequestMapping(value = "/animal", method = RequestMethod.POST, produces = "application/json; charset=utf-8", consumes=MediaType.APPLICATION_JSON_VALUE) 
public @ResponseBody insertanimal(@RequestBody Animal tmp) { 
    return tmp; 
} 

In questo caso la variabile tmp viene convertita automaticamente in Dog o Cat oggetto, a seconda dell'ingresso JSON.

+0

è un modo per mettere qualche annotazione su Cat o Dog, senza inserire '@ JsonSubTypes' su animali? – dmitryvim