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.

19
demandé sur egervari 2011-11-24 03:21:48

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é.

15
répondu Arjan 2017-05-23 11:45:34

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.

6
répondu praveenj 2011-12-05 12:00:19

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.

3
répondu Ravi Bhatt 2012-01-20 11:29:18

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.

0
répondu AntonioOtero 2015-01-26 18:04:13