2014-11-27 8 views
14

Załóżmy, że mam trzy klasy.Spring @ReponseBody @RequestBody z klasą abstrakcyjną

public abstract class Animal {} 

public class Cat extends Animal {} 

public class Dog extends Animal {} 

Czy mogę zrobić coś takiego?

Wejście: json, który jest pies lub kot

wyjściowa: pies/kot zależy od typu obiektu wejściowego

ja nie rozumiem, dlaczego następujący kod nie robi pracę. A może powinienem użyć dwóch oddzielnych metod, aby poradzić sobie z nowym psem i kotem?

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

Aktualizacja: sry i zapomnij podać komunikat o błędzie

HTTP status 500 - przetwarzanie Żądanie nie powiodło się; Wyjątkiem jest zagnieżdżona java.lang.IllegalArgumentException: Typ zmiennej „T” nie może zostać rozwiązany

+2

Co masz na myśli, mówiąc, że "kod nie działa". Runtime error? Błąd kompilatora? Gdzie jest dziennik błędów? Musisz nam pomóc zrozumieć problem. Dzięki. –

Odpowiedz

24

ref link

Właśnie znalazłem odpowiedź siebie i tu jest link referencyjny.

Co mam zrobić dodaje trochę kodu powyżej klasy abstrakcyjnej

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

Następnie na wejściu json w HTML,

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

Po wysłaniu json i wreszcie w sterowniku,

@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; 
} 

W tym przypadku zmienna tmp jest automatycznie konwertowana na Dog lub Cat obiekt, w zależności od wejścia json.

+0

czy można umieścić adnotację na kocie lub psie bez umieszczania '@ JsonSubTypes' na zwierzęciu? – dmitryvim

Powiązane problemy