2010-08-25 6 views
4

J'ai lu tous les documents Web de Spring 3: http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/spring-web.html mais je n'ai trouvé aucune documentation intéressante sur la liaison de données de requête plus complexes, par exemple exemple, disons que j'utilise jQuery pour poster un contrôleur comme ceci:Spring 3 MVC - Liaison de données avancée - Demande de formulaire avec liste d'objets simples

$.ajax({ 
    url: 'controllerMethod', 
    type: "POST", 
    data : { 
     people : [ 
     { 
      name:"dave", 
      age:"15" 
     } , 
{ 
      name:"pete", 
      age:"12" 
     } , 
{ 
      name:"steve", 
      age:"24" 
     } ] 
    }, 
    success: function(data) { 
     alert('done'); 
    } 
}); 

Comment puis-je accepter que par le contrôleur? De préférence sans avoir à créer un objet personnalisé, je préférerais juste pouvoir utiliser des types de données simples, cependant si j'ai besoin d'objets personnalisés pour simplifier les choses, ça me va aussi.

Pour vous aider à démarrer:

@RequestMapping("/controllerMethod", method=RequestMethod.POST) 
public String doSomething() { 
    System.out.println(wantToSeeListOfPeople); 
} 

Ne vous inquiétez pas la réponse à cette question, tout ce que je me soucie de la demande est la manipulation, je sais comment gérer les réponses.

EDIT:

J'ai un code plus d'échantillon, mais je ne peux pas le faire fonctionner, ce que je manque ici?

sélectionner javascript:

var person = new Object(); 
    person.name = "john smith"; 
    person.age = 27; 

    var jsonPerson = JSON.stringify(person); 

    $.ajax({ 
     url: "test/serialize", 
     type : "POST", 
     processData: false, 
     contentType : 'application/json', 
     data: jsonPerson, 
     success: function(data) { 
      alert('success with data : ' + data); 
     }, 
     error : function(data) { 
      alert('an error occurred : ' + data); 
     } 
    }); 

méthode du contrôleur:

public static class Person { 

     public Person() { 
     } 

     public Person(String name, Integer age) { 
      this.name = name; 
      this.age = age; 
     } 
     String name; 
     Integer age; 

     public Integer getAge() { 
      return age; 
     } 

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

     public String getName() { 
      return name; 
     } 

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

    @RequestMapping(value = "/serialize") 
     @ResponseBody 
     public String doSerialize(@RequestBody Person body) { 
      System.out.println("body : " + body); 
      return body.toString(); 
     } 

cela rend l'exception suivante:

org.springframework.web.HttpMediaTypeNotSupportedException: Type de contenu « application/json 'pas pris en charge

Si la méthode doSerialize() prend une chaîne par opposition à une personne, la demande est acceptée, mais la chaîne est vide

Répondre

6

Votre jQuery appel ajax produit le corps de la demande application/x-www-form-urlencoded suivante (en% sous forme décodé avec caractères):

people[0][name]=dave&people[0][age]=15&people[1][name]=pete&people[1][age]=12&people[2][name]=steve&people[2][age]=24 

Spring MVC peut lier les propriétés indexées avec des nombres à List s et les propriétés indexées avec des chaînes à Map s. Vous avez besoin de l'objet personnalisé ici car @RequestParam ne prend pas en charge les types complexes. Donc, vous avez:

public class People { 
    private List<HashMap<String, String>> people; 

    ... getters, setters ... 
} 

@RequestMapping("/controllerMethod", method=RequestMethod.POST)   
public String doSomething(People people) {   
    ... 
} 

Vous pouvez également sérialisation des données en JSON avant de les envoyer, puis utiliser un @RequestBody, comme le suggère Bozho. Vous pouvez trouver un exemple de cette approche dans le mvc-showcase sample.

+0

Cela fonctionne, il semble que si Spring peut gérer cela, il devrait pouvoir aller directement à la HashMap, sauter cet homme du milieu, mais votre code fonctionne exactement comme imprimé – walnutmon

+0

J'ai ajouté une modification en haut qui tente la solution JSON, cela ne fonctionne pas, aucune idée? – walnutmon

+0

@walnutmon: Pour que cela fonctionne, vous devez avoir la bibliothèque Jackson JSON Mapper (http://jackson.codehaus.org/) sur le classpath (ainsi que '' dans le XML de Spring). – axtavt

3

si vous avez <mvc:annotation-driven> activé alors:

@RequestMapping("/controllerMethod", method=RequestMethod.POST) 
public String doSomething(@RequestBody List<Person> people) { 
    System.out.println(wantToSeeListOfPeople); 
} 

(List<Person> pourrait ne pas être la structure que vous souhaitez obtenir, il est juste un exemple ici)

vous pouvez essayer de régler la Content-Type de $.ajax être application/json, si cela ne fonctionne pas immédiatement.

+0

J'aime cette réponse, malheureusement je reçois une exception « org.springframework.web.HttpMediaTypeNotSupportedException: Type de contenu « application/x-www- form-urlencoded 'non supporté' c'est le plus proche de ce que je voudrais, mais le code ne fonctionne pas tel quel – walnutmon

+1

@walnutmon voir muy update. – Bozho

+0

@Bozho: jQuery ne sérialise pas en JSON de toute façon. La sérialisation manuelle est nécessaire, par exemple, 'JSON.stringify' de http://json.org – axtavt

Questions connexes