Problèmes d'envoi de plusieurs objets par le biais de la POSTE et SPRING-MVC
Je suis le développement de REPOS de services qui ont pour recevoir les info multiples. Dans ce cas, deux objets et un attribut.
C'est le javascript où je me suis mise à l'essai de la requête POST
var user = {
username: "admin",
password: "admin"
};
var userToSubscribe = {
username: "newuser",
password: "newpassword",
email: "[email protected]"
};
var openid = "myopenid";
$.ajax({
url: '/myportal/rest/subscribeUser.json',
type: 'POST',
dataType: 'json',
contentType: 'application/json',
mimeType: 'application/json',
data: JSON.stringify({ user: user, userToSubscribe: userToSubscribe, openid: openid})
});
La requête POST:
JSON
openid
"myopenid"
user
Object { username="admin", password="admin"}
userToSubscribe
Object { username="newuser", password="newpassword", email="[email protected]"}
Source
{"user":{"username":"admin","password":"admin"},"userToSubscribe":{"username":"newuser","password":"newpassword","email":"[email protected]"},"openid":"myopenid"}
Et le contrôleur qui gère le POST:
@RequestMapping(method=RequestMethod.POST, value="/subscribeUser.json")
public @ResponseBody Message subscribeUser(@RequestBody("user") User user, @RequestBody("userToSubscribe") User userToSubscribe, @RequestParam String openid){
...
}
Et l'erreur est
POST subscribeUser.json 400 Incorrect demande localhost:8080 990 B [::1]:8080
Ce que je fais mal?
Merci
Est-il une exception disponible dans le conteneur de servlet journaux?
Merci de me répondre @Jk1. Il n'y a aucune exception dans les journaux. Il semble que le POST est mal fait et n'atteint pas le contrôleur :/ mais je ne sais pas ce que je fais mal.
Même si la demande est rejetée avant d'atteindre le contrôleur exception est généralement connecté. Dans le cas de Tomcat (par exemple), il va aller dans catalina.par défaut. Je suggère de regarder du côté serveur exception. Il se peut également que certains de réseau intermédiaire de l'agent, comme proxy, qui est le rejet de la demande à long avant que le serveur cible.
Si je me simplifier la méthode, y compris l'utilisateur et le post au lieu de faire Json.Stringfy y compris dans les données directement: '{"utilisateur":{"nom":"jean","mot de passe":"johnjohn"}}' le contrôleur est atteint, mais l'objet de l'Utilisateur n'est pas rempli.
Merci de me répondre @Jk1. Il n'y a aucune exception dans les journaux. Il semble que le POST est mal fait et n'atteint pas le contrôleur :/ mais je ne sais pas ce que je fais mal.
Même si la demande est rejetée avant d'atteindre le contrôleur exception est généralement connecté. Dans le cas de Tomcat (par exemple), il va aller dans catalina.par défaut. Je suggère de regarder du côté serveur exception. Il se peut également que certains de réseau intermédiaire de l'agent, comme proxy, qui est le rejet de la demande à long avant que le serveur cible.
Si je me simplifier la méthode, y compris l'utilisateur et le post au lieu de faire Json.Stringfy y compris dans les données directement: '{"utilisateur":{"nom":"jean","mot de passe":"johnjohn"}}' le contrôleur est atteint, mais l'objet de l'Utilisateur n'est pas rempli.
OriginalL'auteur mannuk | 2013-10-29
Vous devez vous connecter pour publier un commentaire.
Le corps de la requête contiendra l'intégralité du contenu JSON. Ainsi, lorsque vous voulez la carte au format JSON, vous pouvez utiliser uniquement un RequestBody annoté-paramètre. Vous aurez à faire quelque chose comme ceci:
Et ensuite utiliser le convertValue méthode de le mapper pour obtenir vos différents objets à partir de la chaîne.
De même pour les autres objets
Je ne comprends pas pourquoi Jackson ne peut pas le faire quand c'est la cartographie du JSON pour le paramètre du contrôleur. Il le fait dans d'autres cas, lorsque vous avez un modèle unique - ce qui est à l'empêcher de le faire ici? Comment se fait-il prendre en compte d'autres @RequestParam, mais pas celui qui est un modèle si il y a d'autres @RequestParam?
Pas besoin de créer un
ObjectMapper
à chaque fois qu'il est thread-safe. Le mieux est de stocker uneObjectReader
dans unstatic
variable comme unfinal
champ.OriginalL'auteur Chinmay
Vous ne pouvez pas utiliser
@ModelAttribute
s dans une bonne méthode qui accepte de JSON. Je crois que la bonne méthode est d'utiliser @RequestBody, comme le fait ici. Vous aurez probablement besoin d'envelopper des objets dans certaines classe wrapper, mais je peux me tromper comme je n'ai jamais personnellement essayé de passer plusieurs objets JSON dans une requête avant.Cela dit, je pense que ce serait une bonne idée si vous repenser votre api REST, en supprimant les arguments JSON et au lieu de les passer en tant que partie du chemin de l'URI, si possible. Je suggère la lecture à travers ce blog.
Vous pouvez le recevoir en tant que Chaîne de caractères, puis parser le JSON sur votre propre. Cependant, je pense que vous devriez envisager de simplifier l'API et en utilisant le chemin de l'URI dans le cadre de l'entrée.
Auriez-vous l'esprit pour expliquer avec plus de détails sur ce que vous êtes en train de parler? Merci
OriginalL'auteur CodeChimp
Vous pouvez créer un bean java(POJO) contenant tous les objets tels que..
et passer ce bean dans le service Web. si le web service ressemble..
OriginalL'auteur Harish Bagora