web-dev-qa-db-de.com

Praktische Ratschläge zur Verwendung von Jersey und Guice für den RESTful-Service

Nach allem, was ich online finden kann, stagniert der Stand der Technik für die Integration von Guice + Jersey seit 2008, als es scheint, dass beide Teams in eine Sackgasse geraten sind. Der entscheidende Punkt dabei ist, dass JAX-RS-Annotationen eine Feld- und Methodeninjektion durchführen. Dies funktioniert nicht gut mit Guices eigener Abhängigkeitsinjektion.

Einige Beispiele, die ich gefunden habe, gehen nicht weit genug, um zu klären:

  • Iqbalyusufs Post auf Jersey + Guice in Google App Engine Java leidet unter einer Menge Boilerplate (manuelles Abrufen und Aufrufen des Injektors). Ich möchte, dass Binding und Injection über Guice-Anmerkungen hinter den Kulissen erfolgen.

  • Jonathan Currans Artikel Erstellen eines RESTful-Dienstes mit Jersey, Guice und JSR-250 gab mir Hoffnung, da er viel aktueller ist (2010). Er ging jedoch nicht weiter, als zu zeigen, wie man einen Jersey-Dienst in einem Guice ServletModule startet . Es gibt jedoch keine Beispiele dafür, wie eine echte Abhängigkeitsinjektion durchgeführt wird. Ich nehme an, das war dem Leser als Übung überlassen. Currans Posten ist in der Tat der richtige erste Schritt, um Guice und Jersey zu verkabeln. Deshalb plane ich, damit zu beginnen.

  • verlockend James Strachan schreibt :

    JAX-RS funktioniert gut mit der Abhängigkeit Injektionsrahmen wie Spring, Guice, GuiceyFruit oder JBossMC - Sie kann im Grunde auswählen, wen Sie bevorzugen.

    Ich sehe jedoch keine Beweise, die aus Sicht eines Praktizierenden wahr sind.

Was mir fehlt, sind praktische Beispiele und Erklärungen, wie man JAX-RS- und Guice-Annotationen kombiniert. Zum Beispiel:

  • Ich glaube, ich kann keine Konstruktorinjektion mit einer Ressource verwenden, da Jersey dies steuern möchte
  • Ich bin nicht sicher, ob ich @Inject mit @PathParam, @QueryParam usw. kombinieren kann.
  • Verwendung der Injektion in einer MessageBodyWriter-Implementierung

Hat jemand Beispiele, vorzugsweise mit Quellen, für eine nicht triviale Anwendung, bei der Jersey und Guice kombiniert werden, ohne dabei das eine oder das andere aufzugeben? Ich bleibe auf diesem Weg, aber die Stücke auf den Jersey- und Guice-Listen lassen mich denken, ich wiederhole die Arbeit anderer, die vor mir kamen.

65
toolbear

Die Integration von Guice mit Jersey hat nicht stagniert. Das Gegenteil ist wahr. Dank Paul und seinen Kohorten hinter Jersey enthält die neueste Version 1.7 eine spezielle JerseyServletModule-Klasse für die Verwendung mit Guice-basierten Servlets. Guice-basierter Konstruktor injiziert in JAX-RS-Ressource! Das Problem besteht in der Verwendung von JAX-RS-Anmerkungen wie @QueryParam im Konstruktor einer JAX-RS-Ressource. Du brauchst es nicht! Sie verwenden Guice für die POJO-Injektion einschließlich Singletons. Dann ist JAX-RS ein Sahnehäubchen für das Analysieren von HTTP-basierten RESTful-APIs wie URL-Pfad, Abfrageparameter, Inhaltstyp usw. Sie benötigen auch kein Beispiel für "industrielle Stärke". Sowohl Guice als auch Jersey sind bereits im Test. Sie benötigen nur ein vollständiges Arbeitsbeispiel, um zu sehen, wie es funktioniert. Dann können Sie die erweiterten Funktionen selbst ausprobieren. Unter folgendem Link finden Sie ein vollständiges Beispiel mit Guice 3.0 und Jersey 1.7, die alle die neuesten Versionen sind:
http://randomizedsort.blogspot.com/2011/05/ using-guice-ified-jersey-in-embedded.html

53
Nehc

Ich habe hier eine Guice/Jersey/Jetty/Jackson-Beispielanwendung erstellt:

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

Wenn Sie Fragen oder Vorschläge haben, wie Sie das Beispiel verbessern können, können Sie mir eine Nachricht über github senden. Ziel ist es, Eine sehr leicht zugängliche Einführung in REST auf dem Java-Stack zu machen.

Hoffe das hilft - hab einen schönen Tag!

-Sonnig

21
Sunny Gleason

Inspiriert von der Sunnys-Beispielanwendung habe ich ein ähnliches Beispielprojekt erstellt, das Standard-WAR-Dateien für die Bereitstellung verwendet, z. in Apache Tomcat. Das Projekt finden Sie hier:

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

Viel Spaß! Daniel

9
Daniel Bimschas

Ich hatte ähnliche Probleme, als ich anfing, Guice zu verwenden, um Konstruktorinjektionen in meinen mit Anmerkungen versehenen Klassen in Jersey durchzuführen, aber letztendlich funktionierte es, wenn auch mit einer ziemlich trivialen Anwendung.

Ich habe die Anweisungen hier befolgt: Jersey-Guice Javadoc

Der Trick in meinem Fall war, dass ich die Standard-Jersey-Konfiguration aus meiner web.xml (wie den Jersey ServletContainer) entfernen und nur den Guice-Listener und den Guice-Filter beibehalten musste. Sobald ich das getan hatte, wurde Guice gerufen, um mein JAX-RS-Objekt mit Annotationen zu erstellen, und Jersey injizierte meine JAX-RS-Annotationsmethoden (wie @GET usw.) wie erwartet.

3
Scott

Ich glaube, ich kann den Konstruktor nicht verwenden. Injektion mit einer beliebigen Ressource als Jersey will das kontrollieren

Die Konstruktorinjektion von guice kann nicht verwendet werden, da die Erstellung der Ressource von jersey verwaltet wird. In diesem Fall können Sie die @Inject-Annotation von Jersey vor dem Konstruktorparameter verwenden, den Sie injizieren möchten:

public NewsResource(@Inject NewsService service)
3
Jonas

Obwohl das Beispiel von Sunny Gleason großartig ist, ist es jetzt etwas veraltet. 

Nachdem ich heute viel versucht hatte, Guice und Jersey dazu zu bringen, Nizza miteinander zu spielen, erstellte ich das folgende Beispielprojekt, um Ihnen den Einstieg zu erleichtern:

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

Dieses Projekt verwendet die folgenden Technologien:

  1. Guice für DI
  2. Trikot für die RESTful API
  3. Jackson für POJO zu JSON Mapping
  4. Anlegesteg für den Webserver
  5. Gradle

Ich denke, das Wichtigste ist, dass Sie nicht jede neue Ressourcenklasse, die Sie hinzufügen, explizit angeben müssen. Solange Sie sie zu dem gescannten Paket hinzufügen (siehe malicious.mustard.modules.JerseyModule), werden sie automatisch gefunden!

3
Alex

GWizard enthält ein Modul, das die sofortige Integration zwischen Jersey2 und Guice ermöglicht. Hier ist ein Beispiel eines kompletten JAX-RS-Services:

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();
    }
}

Beachten Sie, dass dies auf dem Squarespace jersey2-guice-Adapter basiert, der bei zukünftigen Point-Releases von Jersey möglicherweise nicht ordnungsgemäß funktioniert. GWizard bietet auch ein RESTEasy JAX-RS-Modul an, das bevorzugt wird.

Hier ist ein Blogeintrag, der dazu beitragen könnte: http://blorn.com/post/107397841765/guice-and-jersey-2-the-easy-way

2
stickfigure
1
Gili

Diese Beispiele waren alles gute Starts für mich, aber ich wollte einen kompletten MVC-Stack mit Jersey-Guice im Kern. Ich habe irgendwann daran gearbeitet, das zu verfeinern. Ab dieser Woche ist dieser MVC-Stack vollständig als Archetyp im Maven Central-Repository implementiert. Das bedeutet, dass Sie jetzt einen neuen Jersey-Guice-Stapel mit einem Maven-Befehl erstellen können:

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

Dadurch wird automatisch ein eigenes Projekt mit der von Ihnen angegebenen Paketbenennung erstellt, sodass Sie ein Vorlagenprojekt nicht manuell bearbeiten müssen.

Weitere Informationen finden Sie im Projekt Readme.md: https://bitbucket.org/mckamey/duel-mvc

Details zu den zweiseitigen Ansichten (clientseitige Vorlagen- und serverseitige Ansichten), die ich verwende, sind hier: https://bitbucket.org/mckamey/duel , aber Sie können sie durch das ersetzen, was Sie verwenden.

1
mckamey

Ich habe ein interessantes Projekt für die leichten Jetty + Guice + Jackson-Webdienste gefunden: https://github.com/talis/jersey-common/

0
Le Hibou

Ich habe eine Beispielanwendung für Guice 4.2, Jetty 9.4 und Jersey 2.7 erstellt:

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

Wie Sunny sagte:

Wenn Sie Fragen oder Vorschläge zur Verbesserung von .__ haben. Zögern Sie nicht, mich per Github zu benachrichtigen. Das Ziel ist es, dies zu machen eine sehr leicht zugängliche Einführung in REST auf dem Java-Stack.

0
bnsd55