2014-11-27 7 views
14

Angenommen, ich habe drei Klassen.Spring @ReponseBody @RequestBody mit abstrakten Klasse

public abstract class Animal {} 

public class Cat extends Animal {} 

public class Dog extends Animal {} 

Kann ich so etwas tun?

Eingang: ein json, die es Hund oder Katze ist

Ausgang: ein Hund/Katze ist abhängig von Eingangsobjekttyp

Ich verstehe nicht, warum Sie den folgenden Code funktioniert nicht. Oder sollte ich zwei getrennte Methoden verwenden, um mit einem neuen Hund und einer neuen Katze umzugehen?

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

Update: sry i vergessen die Fehlermeldung

HTTP-Status 500 enthalten - Request-Verarbeitung fehlgeschlagen; verschachtelte Ausnahme ist java.lang.IllegalArgumentException: Typ Variable ‚T‘ nicht

+2

Was meinst du mit "Code funktioniert nicht." Laufzeit Fehler? Compilerfehler? Wo ist das Fehlerprotokoll? Sie müssen uns helfen, das Problem zu verstehen. Vielen Dank. –

Antwort

24

ref link

Ich habe gerade die mich Antwort gelöst werden und hier ist die Referenzverbindung.

Was ich getan habe einige Code über der abstrakten Klasse hinzugefügt wird

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

Dann im json Eingang in HTML,

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

Nach der json Vorlage und schließlich in der Steuerung,

@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 diesem Fall wird die Variable tmp automatisch in einekonvertiertoder Cat Objekt, abhängig von json Eingabe.

+0

ist es eine Möglichkeit, eine Anmerkung zu Katze oder Hund zu setzen, ohne '@ JsonSubTypes' auf Tier zu setzen? – dmitryvim

Verwandte Themen