web-dev-qa-db-fra.com

Conseils pratiques sur l'utilisation de Jersey et Guice pour un service RESTful

D'après ce que je peux trouver en ligne, l'état d'avancement de l'intégration de Guice + Jersey a stagné depuis 2008, année où les deux équipes se sont retrouvées dans une impasse. Le nœud du problème réside dans le fait que les annotations JAX-RS effectuent une injection de champ et de méthode et que cela ne fonctionne pas bien avec l'injection de dépendances de Guice.

Quelques exemples que j'ai trouvés ne vont pas assez loin pour élucider:

  • Le message de Iqbalyusuf sur Jersey + Guice sur Google App Engine Java souffre de nombreux problèmes (obtenir et appeler manuellement l'injecteur). Je veux que la liaison et l'injection se passent en coulisse via les annotations Guice.

  • Article de Jonathan Curran Créer un service RESTful avec Jersey, Guice et JSR-250 m'a donné de l'espoir car il est beaucoup plus courant (2010), mais est allé au-delà de la démonstration de la création d'un service Jersey à l'intérieur d'un Gulet ServletModule . Cependant, il n'y a pas d'exemple d'injection de dépendance réelle. Je suppose que cela a été laissé comme un exercice pour le lecteur. Le poste de Curran pourrait en fait être le premier pas correct vers le câblage de Guice et de Jersey et je prévois donc de commencer par cela.

  • irrésistiblement James Strachan écrit :

    JAX-RS fonctionne bien avec la dépendance les structures d'injection telles que Spring, Guice, GuiceyFruit ou JBossMC - vous peut en gros choisir celui que vous avez préférer.

    Mais je ne vois aucune preuve qui soit vraie du point de vue d'un pratiquant.

Ce qui me manque, ce sont des exemples pratiques et des explications sur la manière de combiner les annotations JAX-RS et Guice. Par exemple:

  • Je crois que je ne peux pas utiliser l'injection de constructeur avec aucune ressource car Jersey veut contrôler cette
  • Je ne sais pas si je peux combiner @Inject avec @PathParam, @QueryParam, et al.
  • Comment utiliser l'injection dans une implémentation de MessageBodyWriter

Quelqu'un a-t-il des exemples, de préférence avec source, d'application non triviale associant Jersey et Guice sans pour autant sacrifier l'un ou l'autre? Je continue quand même sur cette route, mais les morceaux sur les listes de Jersey et de Guice me font penser que je répète le travail de ceux qui sont venus avant moi.

65
toolbear

L'intégration de Guice à Jersey n'a pas stagné. Le contraire est vrai. Grâce à Paul et à ses cohortes derrière Jersey, la dernière version 1.7 contient une classe spéciale JerseyServletModule permettant de travailler avec des servlets basés sur Guice. L'injection de constructeur basée sur Guice dans la ressource JAX-RS fonctionne! Le problème utilise des annotations JAX-RS telles que @QueryParam dans le constructeur d'une ressource JAX-RS. Vous n'en avez pas besoin! Vous utilisez Guice pour l’injection de POJO, y compris les singletons. Ensuite, JAX-RS est la cerise sur le gâteau pour l'analyse des API RESTful basées sur HTTP, telles que le chemin d'accès aux URL, les paramètres de requête, le type de contenu, etc. Les deux Guice et Jersey sont déjà testés au combat. Vous avez juste besoin d'un exemple de travail complet pour voir comment cela fonctionne. Vous pourrez ensuite expérimenter vous-même des fonctionnalités avancées. Consultez le lien suivant pour un exemple complet utilisant Guice 3.0 et Jersey 1.7, qui sont toutes les dernières versions:
http://randomizedsort.blogspot.com/2011/05/using-guice-ified-jersey-in-embedded.html

53
Nehc

J'ai créé un exemple d'application Guice/Jersey/Jetty/Jackson ici:

http://github.com/sunnygleason/j4-minimal

Si vous avez des questions ou des suggestions sur la manière d’améliorer l’exemple , N'hésitez pas à m'envoyer un message via github. Le but est de faire de Une introduction très accessible de REST sur la pile Java.

J'espère que cela vous aidera - passez une bonne journée!

-Ensoleillé

21
Sunny Gleason

Inspiré par l'exemple d'application Sunnys, j'ai créé un exemple de projet similaire qui utilise des fichiers WAR standard pour le déploiement, par exemple. dans Apache Tomcat. Vous pouvez trouver le projet ici:

https://github.com/danbim/template-guice-jersey-Tomcat

Amusez-vous! Daniel

9
Daniel Bimschas

J'avais des problèmes similaires au début lorsque j'essayais d'utiliser Guice pour effectuer une injection de constructeur sur mes classes annotées de Jersey, mais que cela a finalement fonctionné, bien qu'avec une application assez triviale.

J'ai suivi les instructions ici: jersey-guice javadoc

Dans mon cas, le truc était que je devais supprimer la configuration standard de Jersey de mon web.xml (comme Jersey ServletContainer) et ne conserver que l'écouteur et le filtre Guice. Une fois que j’ai fait cela, Guice a été appelé pour créer mon objet annoté JAX-RS et Jersey injectait mes méthodes annotées JAX-RS (telles que @GET, etc.) comme prévu.

3
Scott

Je crois que je ne peux pas utiliser constructeur injection avec n'importe quelle ressource comme Jersey veut contrôler cela

Vous ne pouvez pas utiliser l'injection de constructeur de guice car la création de ressource est gérée par jersey. Dans ce cas, vous pouvez utiliser l'annotation @Inject du constructeur avant le paramètre de constructeur à injecter:

public NewsResource(@Inject NewsService service)
3
Jonas

Bien que l'exemple de Sunny Gleason soit excellent, il est maintenant un peu dépassé. 

Ainsi, après avoir beaucoup lutté aujourd’hui pour faire jouer Nice et Guice, j’ai créé l’exemple de projet suivant pour vous aider à démarrer:

https://github.com/MaliciousMustard/gradle-guice-jersey-jetty

Ce projet utilise les technologies suivantes:

  1. Guice pour DI
  2. Jersey pour l'API RESTful
  3. Jackson pour le mappage POJO vers JSON
  4. Jetée pour le serveur web
  5. Gradle

J'imagine que le plus important, c'est que vous n'avez pas à spécifier explicitement chaque nouvelle classe de ressources que vous ajoutez. Tant que vous les ajoutez au paquet en cours d'analyse (regardez malicious.mustard.modules.JerseyModule), ils seront automatiquement trouvés!

3
Alex

GWizard inclut un module qui vous permet une intégration prête à l'emploi entre Jersey2 et Guice. Voici un exemple de service complet JAX-RS:

public class Main {
    @Path("/hello")
    public static class HelloResource {
        @GET
        public String hello() {
            return "hello, world";
        }
    }

    public static class MyModule extends AbstractModule {
        @Override
        protected void configure() {
            bind(HelloResource.class);
        }
    }

    public static void main(String[] args) throws Exception {
        Guice.createInjector(new MyModule(), new JerseyModule()).getInstance(Run.class).start();
    }
}

Notez que ceci est basé sur l’adaptateur Squarespace jersey2-guice , qui risque de ne pas fonctionner correctement avec les futures versions ponctuelles de Jersey. GWizard propose également un module RESTEasy JAX-RS, qui est préféré.

Voici une entrée de blog à ce sujet qui pourrait aider: http://blorn.com/post/107397841765/guice-and-jersey-2-the-easy-way

2
stickfigure
1
Gili

Ces exemples étaient tous des bons débuts pour moi, mais je voulais une pile MVC complète utilisant Jersey-Guice en tant que cœur. Je travaille sur le raffinage depuis un moment. Depuis cette semaine, cette pile MVC est entièrement déployée dans le référentiel Maven Central en tant qu’archétype. Cela signifie que vous pouvez maintenant créer une nouvelle pile Jersey-Guice avec une commande Maven:

mvn archetype:generate \
    -DarchetypeGroupId=org.duelengine \
    -DarchetypeArtifactId=duel-mvc-archetype \
    -DarchetypeVersion=0.2.1

Cela génère automatiquement votre propre projet avec la dénomination de package spécifiée, vous évitant ainsi de modifier manuellement un projet de modèle.

Voir le projet Readme.md pour plus de détails: https://bitbucket.org/mckamey/duel-mvc

Les détails des vues à double face (modèle côté client et vues côté serveur) que j'utilise sont les suivants: https://bitbucket.org/mckamey/duel mais vous pouvez le remplacer par tout ce que vous utilisez.

1
mckamey

J'ai trouvé un projet intéressant pour les services Web légers Jetty + Guice + Jackson: https://github.com/talis/jersey-common/

0
Le Hibou

J'ai créé un exemple d'application Guice 4.2, Jetty 9.4 et Jersey 2.7:

https://github.com/bnsd55/jetty-jersey-guice-starter-kit

Comme l'a dit Sunny:

Si vous avez des questions ou des suggestions sur la façon d’améliorer le fichier Par exemple, n'hésitez pas à m'envoyer un message via github. Le but est de faire cela une introduction très accessible de REST sur la pile Java.

0
bnsd55