Ich habe ein Projekt erstellt , um die Abhängigkeitsinjektion von Google Guice in meinem Blog zu testen Jax-rs Ressourcen, mit Resteasy.
Meine Absichten sind:
@ApplicationPath
für die Versionen meiner API. In jeder mit @ApplicationPath
annotierten Klasse lade ich eine Menge von Klassen für die spezifische Version. @Inject
(von Google Guice) in seinem Konstruktor, um einige Dienste zu injizieren. Ich habe zwei Klassen erstellt, die mit @ApplicationPath
: ApplicationV1RS
und ApplicationV2RS
kommentiert wurden. In beiden habe ich die gleichen Ressourcen-Klassen ( UserResource
und HelloResource
) nur für meinen Test hinzugefügt.
Mein Modul ist wie folgt konfiguriert:
%Vor% Wenn ich http://localhost:9095/v1/hello/world
oder http://localhost:9095/v2/hello/world
aufruft, erhalte ich denselben Fehler:
Nun, wie ich erwartet habe, funktioniert das nicht. Der Google Guice ist nicht "schlau", um die Ressourcenklassen mit dem Konstruktor für mich zu instanziieren.
Aber ich kann keinen Weg zur Arbeit finden. Um wirklich ehrlich zu sein, bin ich wirklich verwirrt darüber, wie Google Guice, Jetty und Resteasy in diesem Szenario miteinander spielen.
Wenn ich die Verwendung von @ApplicationPath
ablehne, arbeiten meine Ressourcen mit Google Guice und konfigurieren meine HelloModule
wie folgt:
Aber in diesem Fall übergebe ich das Steuerelement, um meine Ressourcen ( HelloResource
und UserResource
) an Guice zu registrieren. Es ist nicht flexibel für mich, ich kann meine multiple @ApplicationPath
nicht einrichten.
Also, was ich vermisse oder nicht verstehe?
Ich habe ein Projekt mit dem problematischen Code erstellt. Ist sehr einfach einzurichten und zu testen: Ссылка
Danke!
Wenn Sie die Methode getClasses
in Ihrer Anwendung verwenden, versucht sie, eine Instanz für alle registrierten Ressourcen zu erstellen, indem sie den Standardkonstruktor verwendet, der in unserer Ressourcenklasse fehlt. Eine Möglichkeit besteht darin, einen Standardkonstruktor zu erstellen und die Abhängigkeiten über Setter Injection zu injizieren.
Und anstatt getClasses
in ApplicationV1RS
und ApplicationV2RS
zu überschreiben, überschreiben Sie getSingletons
. Da Ressourcen Singleton sein können.
Im Folgenden sind die Änderungen aufgeführt, die ich vorgenommen habe, damit es so funktioniert, wie Sie es möchten.
%Vor%AnwendungV1RS.java
%Vor%AnwendungV2RS.java
%Vor%HalloResource.java
%Vor%UserResource.java
Fügen Sie @Singleton
zu Ihren Serviceklassen hinzu.
Ich hoffe, es hilft.
Ich habe den Code auch auf repo gejagt . schau es dir an
Tags und Links jax-rs embedded-jetty guice resteasy