Est-ce que Spring MVC peut avoir des paramètres de requête pour une méthode de PUT HTTP, ou dois-je utiliser post? Qu'est-ce que je dois utiliser pour me reposer?
j'ai une action de controller je pense que ça devrait être une option HTTP, mais Spring se plaint quand j'essaye d'utiliser @RequestParam dans l'action controller. Les paramètres de requête ne sont-ils pas autorisés pour les méthodes HTTP PUT, et est-ce la raison pour laquelle Spring les rejette?
@RequestMapping(value = "/{helpDocumentId}/vote", method = RequestMethod.PUT)
public void voteHelpfulness(@PathVariable long helpDocumentId, @RequestParam boolean isHelpful) {
helpManager.voteOnHelpDocument(helpDocumentId, isHelpful);
}
Lorsqu'il est exécuté, il met cette erreur:
org.springframework.web.bind.MissingServletRequestParameterException: Required boolean parameter 'isHelpful' is not present
bien sûr, le isHelpful
le paramètre est présent. Je peux faire le code ci-dessus fonctionne parfaitement pour HTTP POST, donc je sais que ce n'est pas le problème.
$.ajax({
url: "/help/" + helpDocumentId + "/vote.json",
type: "PUT",
data: {
isHelpful: isHelpful
},
success: function(response) {
// ....
}
});
est mis la bonne méthode http? Cette action modifie le helpDocument
, mais il n'en crée pas.
4 réponses
Depuis Printemps 3.1, HttpPutFormContentFilter peut être utilisé pour gérer application/x-www-form-urlencoded
données:
filtre qui rend les données encodées de forme disponibles à travers le
ServletRequest.getParameter*()
famille de méthodes lors des requêtes HTTP PUT.la spécification du Servlet exige que les données du formulaire soient disponibles pour les requêtes HTTP POST mais pas pour les requêtes HTTP PUT. Ce filtre intercepte les requêtes HTTP PUT où le type de contenu est
'application/x-www-form-urlencoded'
, lit forme codée contenu du corps de la requête, et enveloppe le ServletRequest afin de rendre les données du formulaire disponibles en tant que paramètres de requête tout comme c'est le cas pour les requêtes HTTP POST.
pour les autres données entrantes, comme JSON, vous aurez besoin de @RequestBody
comme expliqué dans JQuery, Spring MVC @RequestBody and JSON-making it work together, pour ne pas tomber sur un type de média 415 non supporté.
les contrôleurs de printemps prennent en charge GET/HEAD/POST/PUT/DELETE/OPTIONS/TRACE, mais comme votre navigateur ne peut pas envoyer ces méthodes de requête, cela ne fonctionnera pas pour vous.
La solution est d'utiliser le " org.springframework.Web.filtrer.HiddenHttpMethodFilter" fourni au printemps. Il vous faut passer un paramètre caché pour la méthode request. Le paramètre par défaut supporté par ce filtre est "_method".
vérifiez le javadoc du filtre pour plus info.
ceci, comme suggéré ci-dessus, semble être un bug dans spring/servlet API
. En réalité PUT
les requêtes sont supposées fonctionner sur Request Body (or payload)
et non pas sur les Paramètres de la Demande. En ce sens, la manipulation de servlet API & spring est correcte.
ceci étant dit, une solution de contournement meilleure et beaucoup plus facile est de passer aucun élément de données de votre javascript/jQuery
appeler et passer vos paramètres dans le cadre de l'url elle-même. autrement dit, définissez les paramètres dans le champ url comme vous le feriez dans un GET
appel.
$.ajax({
url: "/help/" + helpDocumentId + "/vote.json" + "?param1=param2Val&..",
type: "PUT",
data: "",
success: function(response) {
// ....
}
});
maintenant, cela fonctionne pour les paramètres simples, je suppose, ne fonctionnera pas pour les types JSON complexes. Espérons que cette aide.
j'ai suivi la recommandation dans les commentaires et a changé @RequestParam
@RequestBody
et il a juste travaillé (mon paramètre est une Chaîne de caractères).
je suis d'accord que c'est un bug au printemps parce que le même code qui échoue dans mon environnement de production (quand on utilise @RequestParam
) fonctionne très bien à localhost.