Spring MVC 3 - Liaison de Données Avancées - Formulaire de Demande avec la Liste des Objets Simples
J'ai lu tous les Printemps 3 Web docs: http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/spring-web.html mais ont été complètement incapable de trouver une intéressante documentation sur la liaison plus compliqué de demande de données, par exemple, disons que j'utilise jQuery pour poster un contrôleur comme suit:
$.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ère juste être en mesure d'utiliser de simples types de données, cependant si j'ai besoin d'objets personnalisés pour simplifier les choses, je suis très bien avec ce trop.
Pour vous aider à démarrer:
@RequestMapping("/controllerMethod", method=RequestMethod.POST)
public String doSomething() {
System.out.println( wantToSeeListOfPeople );
}
Ne vous inquiétez pas au sujet de la réponse à cette question, tout ce qui m'intéresse est le traitement de la demande, je sais comment traiter avec les réponses.
EDIT:
J'ai plus d'exemple de code, mais je ne peux pas le faire fonctionner, ce qui me manque ici?
sélectionnez 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 de 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();
}
ce qui rend l'exception suivante:
org.springframework.web.HttpMediaTypeNotSupportedException:
Type de contenu application/json' pas
pris en charge
Si le doSerialize() prend une Chaîne de caractères, par opposition à une Personne, la demande est acceptée, mais la Chaîne est vide,
OriginalL'auteur walnutmon | 2010-08-25
Vous devez vous connecter pour publier un commentaire.
Votre appel ajax jQuery produit est le suivant
application/x-www-form-urlencoded
du corps de la requête (en%)- décodé):Spring MVC peut lier les propriétés indexées avec les numéros de
List
s et les propriétés indexées avec des chaînes àMap
s. Vous avez besoin de l'objet personnalisé ici parce que@RequestParam
ne prend pas en charge les types complexes. Donc, vous avez:Vous pouvez également sérialiser les données en JSON avant de les envoyer, puis utiliser un
@RequestBody
, comme Bozho suggère. Vous pouvez trouver un exemple de cette approche dans le mvc-vitrine de l'échantillon.J'ai ajouté une édition de haut qui tente de le JSON solution, il ne fonctionne pas bien que, une idée?
Pour le faire fonctionner, vous devez avoir Jackson JSON Mappeur de bibliothèque (jackson.codehaus.org) sur le chemin de la classe (ainsi que
<mvc:annotation-driven/>
au Printemps XML).J'ai ajouté jackson-rs et de l'asl, le cartographe et le coeur aussi ajouté <mvc:annotation-driven/>, je vois toujours la même chose, je n'ai aucune idée de pourquoi c'est complètement sans-papiers (le printemps de l'exemple que j'ai vu a toujours eu le même problème lorsque j'essaie de le lancer)
Alors je ne sais pas. Pour moi, il fonctionne très bien.
OriginalL'auteur axtavt
si vous avez
<mvc:annotation-driven>
activé, alors:(
List<Person>
peut-être pas la structure que vous souhaitez obtenir, c'est juste un exemple ici)Vous pouvez essayer le réglage de la
Content-Type
de$.ajax
êtreapplication/json
, si cela ne fonctionne pas immédiatement.voir le muy mise à jour.
jQuery n'est pas sérialiser en JSON de toute façon. Manuel de sérialisation, pour, par exemple,
JSON.stringify
à partir de json.orgil est l'envoi de JSON comme
data
de sa demande. Ou il me manque quelque chose..Si il envoie un objet comme
data
, jQuery utilise la sérialisation: api.jquery.com/jQuery.param. Pour utiliser JSON il a besoin pour convertir un objet en JSON représentation de chaîne manuellement et passer la chaîne commedata
.OriginalL'auteur Bozho
Ont un coup d'oeil à Jackson's spring integration. Il est incroyablement facile à utiliser et puissant.
Une question/réponse AFIN que peut aider sur ce guide:
Spring 3.0 prise de réponse JSON à l'aide de jackson message convertisseur
OriginalL'auteur Adam Gent