Resteasy und Google Guice: Wie verwendet man mehrere @ApplicationPath und Ressourcen mit @Injection?

8

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:

  • Verwenden Sie mehrere @ApplicationPath für die Versionen meiner API. In jeder mit @ApplicationPath annotierten Klasse lade ich eine Menge von Klassen für die spezifische Version.
  • Jede Ressource hat einen @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:

%Vor%

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:

%Vor%

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!

    
Dherik 13.09.2016, 03:08
quelle

1 Antwort

1

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.

  

AnwendungV1RS.java

%Vor%
  

AnwendungV2RS.java

%Vor%
  

HalloResource.java

%Vor%
  

UserResource.java

%Vor%

Fügen Sie @Singleton zu Ihren Serviceklassen hinzu.

Ich hoffe, es hilft.

Ich habe den Code auch auf repo gejagt . schau es dir an

    
Deendayal Garg 22.09.2016, 09:59
quelle