Wie zu Initialisieren Jersey-Anwendung (ResourceConfig) Mit Feder?
Bin ich mit Jersey 2 und Frühling, und ich bin versucht zu initialisieren, meine Jersey-Anwendung (d.h. die Klasse abgeleitet ResourceConfig) mit den Parametern aus der Spring-Kontext.
Hintergrund: ich habe eine single-Jersey-Anwendung, die ich bauen (d.h. einen einzelnen KRIEG) und ich bereitstellen in einem server-cluster mit verschiedenen Spring-Konfigurationen auf verschiedenen Servern zu aktivieren oder zu deaktivieren verschiedenen Teile des Servers, z.B. einige Server haben /search
Ressourcen aktiviert, etc. Das war wirklich leicht in Jersey 1.0: ich habe gerade gesagt,
<context:component-scan base-package="com.mycompany.resources.search"/>
im Frühjahr config zu haben-Jersey-scan Paket und aktivieren Sie die JAX-RS-Ressource-Providern in it.
Nun in 2.0 Jersey der Frühling <context:component-scan ... />
funktioniert nicht, also müssen die Ressourcen programmgesteuert eingetragen, in einem Start-Klasse abgeleitet ResourceConfig
:
public class MyApplication extends ResourceConfig {
public MyApplication() {
packages("com.mycompany.resources.search");
}
}
So weit So gut, aber ich muss bedingt Scannen Sie das Paket, und ich kann nicht herausfinden, wie man jede Spring-Konfiguration in der MyApplication
Klasse. Ich dachte, dass Konstruktor-injection funktionieren könnte:
public class MyApplication extends ResourceConfig {
@Autowired
public MyApplication(@Qualifier("my-config") MyConfiguration myConfiguration) {
if (myConfiguration.isEnabled()) {
packages("com.mycompany.resources.search");
}
}
}
Jedoch HK2 beschwert sich, dass es nicht finden können, ein default-Konstruktor zu verwenden,... also, das zeigt mir, dass DI in spielen bei der Konstruktion dieser Klasse, aber, dass die DI nicht mit Spring.
Ähnlich, mit dem die Spring-bean-lifecycle-funktioniert nicht:
public class MyApplication extends ResourceConfig implements InitializingBean {
@Autowired
private MyConfiguration myConfiguration;
public MyApplication() {
}
@Override
public void afterPropertiesSet() throws Exception {
if (myConfiguration.isEnabled()) {
packages("com.mycompany.resources.search");
}
}
}
(Die afterPropertiesSet
Methode nicht aufgerufen.)
So, jetzt bin ich hängen geblieben: gibt es eine Möglichkeit zum konfigurieren eines Jersey ResourceConfig
application-Objekt mit Frühling?
UPDATE:
Nahm ich @JohnR ' s Antwort unten aber ich werde auch meine eventuelle Lösung, die ich denke, ist ein bisschen sauberer. @JohnR ' s Antwort war, damit das Objekt initialisiert zweimal: zuerst durch den Frühling und dann nach Jersey/HK2. Wenn der Frühling initialisiert das Objekt, das Sie cache-Abhängigkeiten in einer statischen member, und dann, wenn Jersey/HK2 initialisiert Sie Sie später abrufen können, die Abhängigkeiten.
Landete ich, dies zu tun:
public class MyApplication extends ResourceConfig {
public MyApplication() {
ApplicationContext rootCtx = ContextLoader.getCurrentWebApplicationContext();
MyConfiguration myConfiguration = rootCtx.getBean(MyConfiguration.class);
if (myConfiguration.isEnabled()) {
packages("com.mycompany.resources.whatever");
}
}
}
Anstatt das Objekt initialisiert zweimal, lassen wir Jersey/HK2 initialisieren, aber dann rufen wir die Abhängigkeiten von Frühling.
Beide Lösungen sind anfällig für timing: Sie beide davon ausgehen, dass der Frühling initialisiert wird, bevor Jersey/HK2.
- Ich lief in ähnliche Probleme mit Jersey 2 + von Spring. Am Ende landete ich Rollen meine eigene integration. sieht meine Antwort auf diese Frage helfen?
- Das ist eine tolle Antwort. Sehr bedauerlich, dass Sie hatte zu Rollen Sie Ihre eigenen Trikot/Spring Brücke. Leider meine Erfahrung war ähnlich: viel vergeudete Zeit mit Jersey 2 und Frühjahr. Ich bin und läuft jetzt aber die jersey2-Feder-Brücke scheint einen engen, 'happy path' durch Sie und viele Fallstricke, wenn Sie sich verirren. Mein Rat an jemand anderes sich auf Jersey 2 und Spring: Folgen Sie der sample-app und versuchen Sie nicht, irgendetwas anderes zu tun, weil es nicht funktionieren.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube nicht, können Sie konfigurieren, Jersey, um Ihre ResourceConfig vom Frühjahr, als ein Spring managed bean. Es ist ein bisschen hackish, aber Sie könnte so etwas tun. Beachten Sie, dass Sie am Ende mit zwei Instanz der ResourceConfig: man verwaltet vom Frühling und von Jersey:
Wieder, das ist ziemlich hackish. Werden Sie wollen, stellen Sie sicher, Frühling initialisiert wird, bevor Jersey und eng Blick auf alle threading Probleme, die auftreten könnten, während der Initialisierung.