Passer des données dans le corps d'une requête DELETE
J'ai deux Spring MVC méthodes de contrôleur. À la fois de recevoir les mêmes données dans le corps de la requête (en format HTLM POST
forme: version=3&name=product1&id=2
), mais une méthode poignées PUT
demandes et un autre DELETE
:
@RequestMapping(value = "ajax/products/{id}", method = RequestMethod.PUT)
@ResponseBody
public MyResponse updateProduct(Product product, @PathVariable("id") int productId) {
//...
}
@RequestMapping(value = "ajax/products/{id}", method = RequestMethod.DELETE)
@ResponseBody
public MyResponse updateProduct(Product product, @PathVariable("id") int productId) {
//...
}
Dans la première méthode, tous les champs de la product
argument sont correctement initialisés. Dans le second, seul le id
champ est initialisé. Les autres champs sont null
ou 0. (id
est, probablement, initialisé à cause de la id
variable de chemin d'accès).
Je peux voir que la HttpServletRequest
objet contient des valeurs pour tous les champs dans le corps de la requête (version=3&name=product1&id=2
). Ils ont juste ne sont pas mappés sur les champs de la product
paramètre.
Comment puis-je faire la deuxième méthode de travail?
J'ai aussi essayé d'utiliser la @RequestParam
annoté paramètres. Dans la méthode qui gère PUT
demandes, il fonctionne. Dans le DELETE
méthode, j'obtiens une exception: org.springframework.web.bind.MissingServletRequestParameterException: Required String parameter 'version' is not present
.
J'ai besoin de passer des données dans le corps de DELETE
demandes parce que les données contiennent une version de ligne ce qui est utilisé pour le verrouillage optimiste.
source d'informationauteur Alex | 2014-08-19
Vous devez vous connecter pour publier un commentaire.
Le problème n'est pas un
Spring
problème, mais unTomcat
problème.Par défaut, Tomcat va analyser uniquement les arguments qui sont sous la forme de style, lorsque la méthode HTTP est
POST
(au moins pour la version 7.0.54 que j'ai vérifié, mais c'est probablement le même pour toutes Tomcat 7 versions).Afin d'être en mesure de gérer SUPPRIMER méthodes ainsi, vous devez définir la
parseBodyMethods
attribut du Connecteur Tomcat. Le connecteur de la configuration se fait dansserver.xml
.Mise à jour de votre connecteur seraient le plus susceptibles de ressembler à:
Ici est la page de documentation pour la configuration de Tomcat connecteurs.
Une fois le programme d'installation de Tomcat pour analyser les paramètres, le Printemps sera fonctionnent très bien (bien que dans votre cas, vous aurez probablement besoin de supprimer
@RequestBody
à partir de la méthode de contrôleur)Vous pouvez essayer d'ajouter l'annotation @RequestBody à votre Produit argument.
Mais si vous avez juste besoin de passer des informations de version, à l'aide d'une demande de param est plus approprié.
Donc ajouter un nouvel argument dans votre méthode delete @RequestParam("version") int version, et lors de l'appel de la méthode delete passer une requête param comme
..ajax/products/123?version=1
Vous l'avez dit vous demande de param ne fonctionne pas pour vous en supprimez, vous pouvez poster l'url exacte vous avez utilisé et la signature de la méthode ?
Printemps de démarrage de 1,5.*