Comment POSTER un formulaire à l'aide de Jersey 2.0
Je suis en train d'obtenir des données à partir d'un Formulaire avec jersey et je pensais qu'il allait être une tâche facile à accomplir, mais je reçois une erreur lorsque j'essaie de POSTER quelque chose.
Caused by: java.lang.IllegalStateException: The @FormParam is utilized when the content type of the request entity is not application/x-www-form-urlencoded
at org.glassfish.jersey.server.internal.inject.FormParamValueFactoryProvider$FormParamValueFactory.ensureValidRequest(FormParamValueFactoryProvider.java:126)
at org.glassfish.jersey.server.internal.inject.FormParamValueFactoryProvider$FormParamValueFactory.getForm(FormParamValueFactoryProvider.java:111)
at org.glassfish.jersey.server.internal.inject.FormParamValueFactoryProvider$FormParamValueFactory.get(FormParamValueFactoryProvider.java:94)
at org.glassfish.jersey.server.internal.inject.AbstractHttpContextValueFactory.provide(AbstractHttpContextValueFactory.java:65)
at org.glassfish.jersey.server.spi.internal.ParameterValueHelper.getParameterValues(ParameterValueHelper.java:80)
... 36 more
Je pense que c'est la partie pertinente de la trace de la pile.
Maintenant, pour le code, je suis en utilisant:
@POST
@Path("/delete")
@Produces("application/json")
public String delete(@FormParam("id")String id){
Et je suis en train de POSTER à l'aide d'un test page html comme ceci:
<form action="<path to the server>/delete" method="post">
primary_id: <input type="text" name="primary_id" /><br />
<input type="submit" value="Submit" />
</form>
J'ai essayé de le faire fonctionner, mais pas de chance. J'ai essayé d'ajouter le @Consomme() annotation avec multipart-form-data mais ne peuvent pas vraiment faire le travail. J'espère que quelqu'un peut me donner un coup de main.
essayez Consomme(application/x-www-form-urlencoded)
j'ai essayé, mais le même résultat.
j'ai essayé, mais le même résultat.
OriginalL'auteur XFCC | 2012-09-10
Vous devez vous connecter pour publier un commentaire.
Merci à vous tous pour l'aide. Avec certains de révision du code, j'ai trouvé le problème. Même si je ne pense pas que quelqu'un d'autre va faire cette erreur, je vais le poster quand même pour référence future.
Le problème est que je ne suis pas à l'aide d'un serveur web standard. J'ai mis en place un netty serveur avec Jersey et le problème a été en ce que ladite mise en œuvre. Le problème était que je n'étais pas en passant les en-têtes de la requête HTTP à Jersey, comme je le devrais. Je perdais le Type de Contenu dans le milieu de l'opération, cela signifie que le Jersey n'arrivait pas à identifier le type de message.
Donc, pour référence future, pour toute personne ayant un problème similaire, tout en essayant de mettre en œuvre un non-standard server à l'aide de jersey: lorsque vous ne passez pas le type de média correctement (il y a une méthode appelée getMediaType() dans le ContentRequest classe qui est utilisée, entre autres choses, pour valider le Type de Contenu lorsque @FormParam est utilisé), vous obtiendrez ce type d'Exception.
Encore une fois, merci à vous tous pour l'aide 🙂
Pouvez-vous donner un exemple de la façon dont vous l'avez fait?
eh bien, c'était il y a 5 ans et je n'arrive pas à se rappeler les détails. Votre question est à propos de la liaison de maillot de netty ou tout simplement comment j'ai passé les en-têtes?
J'ai mis en place, à l'époque, un gestionnaire pour netty qui aurait connaissance de la ApplicationHandler de jersey. Lorsqu'un message a été reçu, j'ai lu la demande, a créé un ContainerRequest (puisque c'est l'objet que Jersey est l'attendent) et de gérer le niveau de l'application, via ApplicationHandler que j'avais des connaissances sur. J'ai ensuite eu un netty ContainerResponseWriter qui s'occupait de la réponse au client. Sur les en-têtes, vous devriez regarder InboundMessageContext de jersey, qui est prolongée par ContainerRequest et vont probablement vous dire de quoi vous avez besoin. Tout ce que je peux les aider avec il suffit de demander.
OriginalL'auteur
Votre code fonctionne bien sauf qu'il faut changer
Puisque vous havent définir @Consomme(), par défaut, supprimer la méthode consomme
mediaType="application/x-www-form-urlencoded" .
J'ai testé ton code et il fonctionne parfaitement bien ici. Ma suggestion est de vérifier votre maillot de fichiers jar Spécialement jsersey-server.jar fichier dans votre dossier lib.
OriginalL'auteur
Vous nommez votre entrée comme "primary_id", mais que vous recevez "id" nom @FormParm annotation. Changer l'id et le nom de votre balise d'entrée à la "id".
Aussi, si vous consommez de l'application/x-www-form-urlencoded, ajouter cet attribut à votre balise de formulaire: enctype="application/x-www-form-urlencoded"
Bizarre.. assurez-vous que toutes les libs sont de la même version (par exemple 1.13).
en fait, comme je l'ai dit dans le titre je suis à l'aide de jersey 2.0. De toute façon j'ai trouvé le problème, je vais le poster de référence pour l'avenir, même si je ne pense pas vraiment que quelqu'un va avoir un problème similaire 🙂
OriginalL'auteur