Wie initialisiert man Jersey-Anwendung (ResourceConfig) mit Spring?

8

Ich verwende Jersey 2 und Spring, und ich versuche, meine Jersey-Anwendung (d. h. die von ResourceConfig abgeleitete Klasse) mit Parametern aus dem Spring-Kontext zu initialisieren.

Hintergrund: Ich habe eine einzelne Jersey-Anwendung, die ich erstelle (d. h. eine einzelne WAR) und stelle sie über einen Server-Cluster mit verschiedenen Spring-Konfigurationen auf verschiedenen Servern bereit, um verschiedene Teile des Servers zu aktivieren oder zu deaktivieren, z. Einige der Server haben /search Ressourcen aktiviert usw. Das war wirklich einfach in Jersey 1.0: Ich habe nur gesagt,

%Vor%

in einer Spring-Konfiguration, damit Jersey dieses bestimmte Paket scannt und die JAX-RS-Ressourcenanbieter darin aktiviert.

Jetzt in Jersey 2.0 funktioniert die Spring <context:component-scan ... /> nicht mehr, also müssen Ressourcen programmgesteuert in einer von ResourceConfig :

abgeleiteten Startup-Klasse registriert werden %Vor%

So weit, so gut, aber ich muss bedingt dieses Paket scannen, und ich kann nicht herausfinden, wie man eine Spring-Konfiguration in die Klasse MyApplication bringt. Ich dachte, dass die Konstruktorinjektion funktionieren könnte:

%Vor%

HK2 beklagt sich jedoch, dass es keinen Standardkonstruktor finden kann, der verwendet werden kann. Dies zeigt mir, dass DI in der Konstruktion dieser Klasse im Spiel ist, aber dass die DI nicht Spring verwendet.

>

Auch die Verwendung des Spring-Bean-Lebenszyklus funktioniert nicht:

%Vor%

(Die Methode afterPropertiesSet wird nicht aufgerufen.)

So, jetzt stecke ich fest: Gibt es eine Möglichkeit, ein Jersey ResourceConfig -Anwendungsobjekt mit Spring zu konfigurieren?

UPDATE:

Ich habe die Antwort von @ JohnR unten akzeptiert, aber ich werde auch meine mögliche Lösung einbeziehen, die meiner Meinung nach ein bisschen sauberer ist. @ JohnRs Antwort war, das Objekt zweimal initialisieren zu lassen: erst mit Spring und dann mit Jersey / HK2. Wenn Spring das Objekt initialisiert, werden die Abhängigkeiten in einem statischen Member zwischengespeichert, und wenn Jersey / HK2 es später initialisiert, können Sie die Abhängigkeiten abrufen.

Ich habe das getan:

%Vor%

Anstatt das Objekt zweimal initialisieren zu lassen, lassen wir es von Jersey / HK2 initialisieren, aber dann rufen wir die Abhängigkeiten von Spring ab.

Beide Lösungen sind anfällig für Timing: Beide gehen davon aus, dass Spring vor Jersey / HK2 initialisiert wird.

    
Michael Iles 08.01.2014, 14:54
quelle

1 Antwort

0
  

So, jetzt bin ich fest: Gibt es eine Möglichkeit, ein Jersey zu konfigurieren   ResourceConfig-Anwendungsobjekt mit Spring?

Ich glaube nicht, dass Sie Jersey so konfigurieren können, dass Sie Ihre ResourceConfig von Spring als Spring-Bean erhalten. Es ist ein bisschen hackisch, aber du könntest so etwas machen. Beachten Sie, dass Sie zwei Instanzen Ihrer ResourceConfig erhalten: eine von Spring und eine andere von Jersey:

%Vor%

Auch das ist ziemlich hetzisch. Sie sollten sicherstellen, dass Spring vor Jersey initialisiert wird, und mögliche Threading-Probleme, die während der Initialisierung auftreten können, genau betrachten.

    
John R 08.01.2014, 17:38
quelle

Tags und Links