11
votes

Comment activer JSONP dans Reseaseasy?

titre dit de mon problème. J'ai besoin d'envelopper DTO dans une méthode javascript. Actuellement, je reviens sur demande JSON. Mais problème avec l'utilisation de cela dans Ajax parce que j'envoie d'arriver à un autre domaine. et bien sûr la police de la sécurité.

J'ai une idée de créer une offre d'addition. Avez-vous un exemple, des liens ou une suggestion comment peut-on faire cela?


0 commentaires

5 Réponses :


12
votes

Il n'y a pas de support explicite pour JSONP dans Reseastant, mais un moyen facile d'activer JSONP dans votre application est d'écrire un filtre de servlet.

Voici quelques liens qui peuvent vous aider à écrire un filtre:

  • JSONP-Java: filtre latéral du serveur enveloppe toute réponse dans un rappel JSONP < / a>

  • Serviant JSONP à partir de vos services Web JAX-RS

  • Mise en œuvre d'un filtre de servlet pour Rappel JSONP avec délégation de ressortFilterProxy (si vous utilisez le printemps)

    Quand j'avais eu cette exigence, j'ai fini par écrire le mien car aucun des exemples que j'ai trouvés ne semblait tout de même. Voici mes conseils pour écrire votre propre filtre:

    • Enveloppez uniquement la réponse si un paramètre de rappel est spécifié (évidemment)

    • Enveloppez uniquement la réponse si le type de contenu de réponse est Application / JSON (ou si vous souhaitez prendre en charge une sélection plus large de variantes, enveloppez uniquement si le type de contenu de réponse est Application / JSON ou Application / * + JSON )

    • Utilisez httpServletResponsewrapper afin que vous puissiez invoquer la chaîne avant ( chaîne.dofilter ) sans écrire de données à la réponse réelle. Une fois la chaîne avant terminée, vous pouvez ensuite vérifier le type de contenu, assurez-vous de vouloir envelopper la réponse en tant que JSONP, puis écrivez les données capturées dans la réponse réelle , ainsi que le préfixe JSONP et le suffixe.

    • Lorsque vous décidez d'envelopper la réponse en tant que JSONP, assurez-vous de modifier le type de contenu de réponse en Texte / JavaScript

      Si vous n'avez pas beaucoup fait avec Java EE Filtres auparavant, vous voudrez peut-être lire la section pertinente du didacticiel Java EE en premier: Demandes et réponses de filtrage .


4 commentaires

Puis-je voir votre mise en œuvre? Le mien continue de retourner XML dans le rappel.


Je crains que tu ne puisses pas; Je ne peux pas libérer la source :( Quel fournisseur restant utilisez-vous pour produire votre JSON? J'utilise le fournisseur de Reseasey-Jackson. Assurez-vous que votre méthode de ressource est marquée comme @Produces ("Application / JSON") puis dans votre filtre , Vérifiez ce qui a été écrit dans le wrapper de réponse. Si la chaîne avant écrit XML dans le wrapper de réponse, cela n'a rien à voir avec votre filtre JSONP. Essayez d'examiner les réponses à l'aide de Firebug ou de chrome (avec et sans paramètre de rappel). Si vous postez votre code quelque part, je peux jeter un coup d'oeil.


Bonjour Joelittlejohn, pourriez-vous m'aider s'il vous plaît. Je ne peux pas définir de type de contenu sur text / javascript. réponse.iscommouver () == True et en conséquence ne peut pas changer de type. Toute solution?


@Tioma, je pense que vous passez à la réponse réelle à la chaîne avant au lieu d'utiliser une enveloppe de réponse. Si vous avez la réponse de Sergei et que vous prenez une attention particulière aux pièces impliquant le byteAreRayOutPutStream et httpServletResponsewrapper alors cela devrait alors aider.



4
votes

Je fais des projets de contournement pour ce problème. Essayez-le. Cette solution prend des données via HTTP Obtenir des paramètres et traduisez la demande de poste virtuelle.

jQuery: xxx

Déclaration dans l'interface de service < / strong> xxx

Classe de filtre: xxx

web.xml < / strong> xxx


0 commentaires

2
votes

Une amélioration pour soutenir JSONP doit être publiée dans ReseaseAsy 2.3.6 final / 3.0-bêta-4 ( https://issues.jboss.org/browse/ressey-342 ). J'ai été capable de "backport" ma projet qui utilise reseasey 2.3.5 en copiant simplement leur code de Github .

Reseasey reprend automatiquement le nouveau fournisseur basé sur l'annotation. Il fonctionne automatiquement en enveloppant vos résultats dans un rappel JS une fois qu'il considère un paramètre de requête nommé "rappel" dans l'URL. Ceci est compatible avec ce que JQuery envoie au serveur pour les demandes JSONP.


0 commentaires

1
votes

Pour suivre à partir de @talawahdotnet, j'utilise reseasey 3.0.9.finale et il est prudent pour JSONP, une fois activé, toute demande avec un paramètre de requête "rappellera" sera enveloppée comme JSONP. J'utilise JBoss pour que les documents complètes sont ici pour d'autres conteneurs. Voici les étapes que je devais faire:

  1. dans votre web.xml Ajouter: XXX

  2. Assurez-vous d'avoir un web-Inf / jboss-déploiement-structure.xml avec: XXX

  3. Assurez-vous de disposer d'une dépendance restricée-jackson-fournisseur dans votre pom.xml, quelque chose comme: XXX


3 commentaires

Je mettez dans les paramètres de rappel et je l'obtiens en réponse, mais le "type" indique toujours l'application / JSON. Dois-je annoter la méthode @get dans mon code pour faire référence au fournisseur d'une manière ou d'une autre?


Pour être honnête, je n'ai peut-être pas vérifié que le type de contenu était correct à l'époque, mais vous pouvez essayer de la définir manuellement avec @Produces ou de retourner un objet de réponse avec le jeu de types


Vous pouvez utiliser l'application / JSON, j'ai essayé et cela a fonctionné bien ... Juste une mise à jour mineure en version 3.0.12: l'intercepteur correct est org.jboss.resseasy.plugins.providers.jackson. Jackson2jsonpin Terceptor et, d'ailleurs, sur la version 3.0.10, il y a un bogue, ce qui provoque une erreur JavaScript lorsque le navigateur reçoit la réponse JSON: Stackoverflow.com/a/29484700/3335350