Printemps @MVC et le @RequestBody annotation avec x-www-form-urlencoded de données?
Je suis à essayer de comprendre pourquoi je ne peux pas obtenir une demande de jQuery.appel ajax, lorsque le Printemps @Controller
méthode de gestionnaire comprend un @RequestBody
annotation. Considérez les points suivants:
HTML/JavaScript:
<form id="foo" action="/baz">
<input name="bar">
</form>
<script>
$(function() {
var $fooForm = $('#foo');
$fooForm.on('submit', function(evt) {
evt.preventDefault();
$.ajax({
url: $fooForm.action,
data: $fooForm.serialize(),
dataType: 'json',
type: 'POST',
success: function(data) { console.log(data); }
});
});
});
</script>
Java:
@RequestMapping(
value = "/baz",
method = RequestMethod.POST,
consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE,
produces = MediatType.APPLICATION_JSON_VALUE
)
public @ResponseBody SearchResults[] jqueryPostHandler(
@RequestBody FormDataObject formData)
{
return this.searchService.find(formData);
}
Ci-dessus échoue avec l' @RequestBody
annotation actuelle et de retourner 415 erreur (aucune exception ne sera générée). Mais si le @RequestBody
annotation est supprimé (c'est à dire le paramètre de signature est juste FormDataObject formData
) ensuite, la méthode sera appelée et JSON sera retourné à l'JavaScript.
Pourquoi est-ce le cas? Un POST
demande comprend les données dans le corps de la demande. Ne pas le processus d'annotation d'une telle demande?
Je me rends compte que je pouvais changer le type de contenu envoyé par le JavaScript pour application/json
et la consumes
propriété MediaType.APPLICATION_JSON_VALUE
pour faire de l'annotation fonctionner correctement. Mais pourquoi ne pas travailler avec une forme normale de demande?
Note: je suis à l'aide de Printemps 3.1.4.
OriginalL'auteur James Sumners | 2013-05-08
Vous devez vous connecter pour publier un commentaire.
Avez-vous essayé de tourner l'enregistrement sur 'org.springframework.web' pour savoir la raison pour laquelle le code d'état renvoyé? Il devrait y avoir une exception est levée et connecté avant d'être traduit en 415.
Également si l'envoi des données du formulaire, pourquoi ne pas simplement laisser les @RequestBody. Vous serez ensuite utiliser la liaison de données (c'est à dire @ModelAttribute) qui s'appliqueront Servlet paramètres de la demande pour des champs d'objet. C'est préférable à l'utilisation de la FormHttpMessageConverter.
@RequestBody
annotation en place t de la carte à la bonne méthode, mais il jette org.springframework.web.HttpMediaTypeNotSupportedException: type de Contenu application/x-www-form-urlencoded;charset=UTF-8' non pris en charge".De ma compréhension limitée, l'annotation
@RequestBody
implique que le traitement des données sera dans le corps de la demande. Cela informe le compilateur et la personne qui lit le code. Donc, laissant rend ambiguës code. C'est pourquoi je veux savoir pourquoi c'est un échec.OriginalL'auteur Rossen Stoyanchev
Comme le Printemps Docs de @RequestBody dit, le corps de la requête serait convertie à votre objet par
HttpMessageConverter
.Il y a 4 par défaut HttpMessageConverters:
à partir d'un javax.xml.transformer.Source.
Pour convertir les url de la forme codée, ce qui est ajax.serialize() créer, c'est le travail de
FormHttpMessageConverter
. Puisque vous avez unHttpMediaTypeNotSupportedException
exception, je suppose que vous n'avez pas à configurerFormHttpMessageConverter
. Vérifiez votre configuration spring fichier, voici un exemple :est votre problème, le même que celui de la question? ma réponse à cette question, et si le vôtre est différent, ou peut-être que vous devriez poser une nouvelle question pour expliquer avec plus de détails.
Pas exactement le même problème: j'ai l'erreur 406 lors de la soumission de formulaire et de succès lors de la soumission de JSON. Cependant, avant que je débogué avec code à partir du Printemps, je ne comprenais pas que l'entité de la requête d'une certaine manière de mettre en œuvre
MultiValueMap
afin de travailler avecFormHttpMessageConverter
. Donc maintenant je commence à penser que soit l'OPFormDataObject
implémente cette interface ou autre, je vais avoir le même problème que l'OP mais en ajoutant que le convertisseur ne fonctionne pas. Et par la façon dont je suis par Ressort 4.2Je vous suggère de poser une nouvelle question pour votre problème, dans ce commentaire, ne sont pas assez.
cela devrait être le cas. Mais vous pouvez convertir le MultiValueMap pour Objet de vous-même.
OriginalL'auteur Qianyue
Le problème est que lorsque nous utilisons application/x-www-form-urlencoded, le Printemps n'est pas à la comprendre comme une RequestBody. Donc, si nous voulons utiliser cette
nous devons supprimer les @RequestBody annotation.
Essayez les solutions suivantes:
Note, qui a supprimé l'annotation @RequestBody
réponse: Requête Http Post avec un type de contenu application/x-www-form-urlencoded pas de travail au Printemps
OriginalL'auteur Douglas Ribeiro