10
votes

Spring @mvc et l'annotation de @Requestly avec des données X-www-form-urlencodes?

J'essaie de comprendre pourquoi je ne peux pas recevoir de demande d'un appel JQuery.ajax lorsque, puis Spring @Controller La méthode du gestionnaire comprend un @Requestbody Annotation. Considérons les suivants:

html / javascript : xxx

java : xxx

Ce qui précède échouera avec le @Requestbody Annotation Prière et renvoyer une erreur 415 (aucune exception ne sera générée). Mais si l'annotation @Requestbody est supprimée (c'est-à-dire que la signature du paramètre est juste formdataObject formdata ) puis la méthode sera appelée et JSON sera renvoyé à la JavaScript.

Pourquoi est-ce le cas? Une requête post inclut les données dans le corps de la demande. Ce n'est pas le processus d'annotation une telle demande?

Je me rendrais compte que je pourrais changer le type de contenu envoyé par le JavaScript vers Application / JSON et le Consumes Propriété à mediatype.application_json_value pour que l'annotation fonctionne correctement. Mais pourquoi ne fonctionne-t-il pas avec une demande de forme normale?

note : J'utilise le printemps 3.1.4.


3 Réponses :


7
votes

Avez-vous essayé de changer de journalisation sur 'org.springframework.web' pour trouver la raison du code d'état retourné? Il devrait y avoir une exception élevée et connectée avant qu'elle ne soit traduite à un 415.

De plus, si vous envoyez des données de formulaire, pourquoi ne pas simplement laisser le @requestbody. Vous utiliserez ensuite une liaison de données (I.E. @modelattribute) qui appliqueront des paramètres de demande de servlet aux champs d'objet. Ceci est préférable à utiliser le formhttpmessagecverter.


2 commentaires

Allumer la journalisation montre qu'avec le @Requestbody ANNOTATION EN PLACE IT FAIT MAP dans la méthode de droite, mais il jette "org.springframework.web.httpmetiatiatiatypenotsupportedexception: Type de contenu" Application / X-www-Form-Urlencodé; Charset = UTF-8 'non pris en charge ".


De ma compréhension limitée, l'annotation @Requestbody implique que les données à traiter seront dans le corps de la demande. Cela informe le compilateur et la personne qui lit le code. Donc, laissant cela fait du code ambigu. C'est pourquoi je veux savoir pourquoi cela échoue.



6
votes

6 commentaires

Ce qui précède n'a pas fonctionné pour moi, même si j'ai ajouté tous les convertisseurs. J'ai dû utiliser le convertisseur personnalisé à Stackoverflow.com/a/31083802/471213 pour le faire fonctionner


@ USR-local-εψηελων est votre problème identique à cette question? Ma réponse est pour cette question et si le vôtre est différent, vous devriez peut-être poser une nouvelle question à expliquer plus de détails.


Pas le même problème exact: j'ai une erreur 406 lors de la soumission de la forme et du succès lors de la soumission de JSON. Cependant, avant de déboguer avec le code du printemps, je n'ai pas compris que l'entité de la demande DOOK Est-ce que vous devez mettre en évidence mulvenébémap afin de fonctionner avec formhttpmessagecverter . Donc, maintenant je commence à penser que l'OP est formdataOObject implémente cette interface ou autrement, j'ai le même problème que l'op mais l'ajout de ce convertisseur ne fonctionne pas. Et par la façon dont j'utilise le printemps 4.2


@ USR-local-εψηελων Je vous suggère de poser une nouvelle question à votre problème, dans ce commentaire, pas assez d'informations sont fournies.


Utilisation de formhttpmessagecverter signifie que je ne peux pas lier le formulaire à un objet personnalisé? Il sera toujours convertit à Multivantemap?


@Sidneydemoraes, il devrait s'agir de cette affaire. Mais vous pouvez convertir le multivaleumap en objet par vous-même.



-3
votes

Le problème est que lorsque nous utilisons Application / X-www-Form-Urlencodé Strong>, le ressort ne le comprend pas comme une requête. Donc, si nous voulons utiliser ceci Nous devons supprimer l'annotation forte> @Requestbody forte>.

Essayez ce qui suit: P>

@RequestMapping(
        value = "/baz",
        method = RequestMethod.POST,
        consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE,
        produces = MediatType.APPLICATION_JSON_VALUE
)
public @ResponseBody SearchResults[] jqueryPostHandler(
        FormDataObject formData)
{
    return this.searchService.find(formData);
}


0 commentaires