2014-04-11 9 views
16

Moje kodu jest jak poniżej:otrzymaniu json i deserializacji lista obiektu na wiosnę mvc kontroler

kontroler

@RequestMapping(value="/setTest", method=RequestMethod.POST, consumes="application/json") 
public @ResponseBody ModelMap setTest(@RequestBody List<TestS> refunds, ModelMap map) { 
    for(TestS r : refunds) { 
     System.out.println(r.getName()); 
    } 
    // other codes 
} 

testy Pojo

public class TestS implements Serializable { 
    private String name; 
    private String age; 
    //getter setter 
} 

JSON żądania

var z = '[{"name":"1","age":"2"},{"name":"1","age":"3"}]'; 
$.ajax({ 
    url: "/setTest", 
    data: z, 
    type: "POST", 
    dataType:"json", 
    contentType:'application/json'    
}); 

To daje ten błąd

java.lang.ClassCastException: java.util.LinkedHashMap nie mogą być oddane do com.gogoair.cidb.entities.TestS

Używam wiosna 3.1.2 i Jackson 2.0.4

Edycja: Chcę otrzymać listę obiektów TestS w mojej metodzie sterownika i przetworzyć je. Nie jestem w stanie znaleźć, jeśli wysyłam błędny json lub moja metoda jest błędna.

+0

Czy jesteś pewien, że to twój aktualny kod? Klient wywołuje '/ cmp/approveRefunds', a kontroler jest zmapowany do'/setTest'. –

+0

zmodyfikowane pytanie – HKumar

+1

odsyłają to, http: //stackoverflow.com/questions/10864049/map-json-array-of-objects-to-requestbody-listt-using-jackson – Touchstone

Odpowiedz

31

Oto kod, który działa dla mnie. Kluczem jest to, że potrzebujesz klasy opakowania.

public class Person { 

    private String name; 
    private Integer age; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public Integer getAge() { 
     return age; 
    } 

    public void setAge(Integer age) { 
     this.age = age; 
    } 

    @Override 
    public String toString() { 
     return "Person [name=" + name + ", age=" + age + "]"; 
    } 

PersonWrapper klasy

public class PersonWrapper { 

    private List<Person> persons; 

    /** 
    * @return the persons 
    */ 
    public List<Person> getPersons() { 
     return persons; 
    } 

    /** 
    * @param persons the persons to set 
    */ 
    public void setPersons(List<Person> persons) { 
     this.persons = persons; 
    } 
} 

Moje metody kontrolera

@RequestMapping(value="person", method=RequestMethod.POST,consumes="application/json",produces="application/json") 
    @ResponseBody 
    public List<String> savePerson(@RequestBody PersonWrapper wrapper) { 
     List<String> response = new ArrayList<String>(); 
     for (Person person: wrapper.getPersons()){ 
     personService.save(person); 
     response.add("Saved person: " + person.toString()); 
    } 
     return response; 
    } 

Żądanie wysłane jest json w POST

{"persons":[{"name":"shail1","age":"2"},{"name":"shail2","age":"3"}]} 

A odpowiedź jest

["Saved person: Person [name=shail1, age=2]","Saved person: Person [name=shail2, age=3]"] 
+0

Wystąpił problem z otrzymaniem listy obiektów TestS, nie jest to drukowanie tego błędu sysout. – HKumar

+0

Chcę otrzymać listę obiektów TestS w mojej metodzie sterownika i przetworzyć je. jak to zrobić – HKumar

+0

Spójrz na moją zredagowaną odpowiedź. Mam nadzieję, że to odpowiada na twoje zapytanie. – Shailendra

9

Nie jest to możliwe tak, jak próbujesz. The Jackson unmarshalling działa na skompilowanym kodzie Java po wymazaniu typu. Więc

public @ResponseBody ModelMap setTest(@RequestBody List<TestS> refunds, ModelMap map) 

jest naprawdę tylko

public @ResponseBody ModelMap setTest(@RequestBody List refunds, ModelMap map) 

(bez rodzajowych w liście Arg).

Domyślny typ, jaki tworzy Jackson, gdy usuwa się znakowanie List, jest LinkedHashMap.

Jak wspomniano przez @Saint można obejść to poprzez stworzenie własnego typu na liście tak:

class TestSList extends ArrayList<TestS> { } 

a następnie zmodyfikowanie podpis kontrolera

public @ResponseBody ModelMap setTest(@RequestBody TestSList refunds, ModelMap map) { 
+1

To nie jest prawda. Sprężyna 4 obsługuje to. Zawsze można uzyskać sparametryzowany parametr metody z ich rzeczywistymi argumentami typu poprzez odbicie. –

+0

Ale ponieważ nie używają Spring 4, ta część odpowiedzi jest właściwa. Usuń bit do usuwania typu. –

+0

@SotiriosDelimanolis Dobra wskazówka, nie wiedziałem o tym. Czy mógłbyś skierować mnie do części w źródłowych dokumentach, gdzie jest wspomniany lub jest pochowany w źródłach? –

6
@RequestMapping(
     value="person", 
     method=RequestMethod.POST, 
     consumes="application/json", 
     produces="application/json") 
@ResponseBody 
public List<String> savePerson(@RequestBody Person[] personArray) { 
    List<String> response = new ArrayList<String>(); 
    for (Person person: personArray) { 
     personService.save(person); 
     response.add("Saved person: " + person.toString()); 
    } 
    return response; 
} 

Możemy użyj Array jak pokazano powyżej.

+0

To rozwiązanie działa – Yugandhar

+0

Potwierdzone. To rozwiązanie jest najbardziej eleganckim imo. – jonasespelita

Powiązane problemy