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.
InformationsquelleAutor Michael Iles | 2014-01-08
Schreibe einen Kommentar