Wie kann unter Verwendung von Jersey 2.0 eine bindbare Instanz pro Anforderung registriert werden?

... wenn die Instanz manuell erstellt werden muss, möglicherweise von einer Factory-Klasse eines Drittanbieters? Zuvor (Jersey 1.x) haben Sie Folgendes ausgeführt:

public class MyInjectableProvider extends PerRequestTypeInjectableProvider<Context, MyInjectable> {
    public MyInjectableProvider() {
        super(MyInjectable.class);
    }

    @Override
    public Injectable<MyInjectable> getInjectable(ComponentContext ic, Context context) {
        MyInjectable myInjectableInstance = //...

        return new Injectable<MyInjectable>() {
            @Override
            public MyInjectable getValue() {
                return myInjectableInstance;
            }
        };
    }
}

Die anonyme lokale Klasse kann auf eine Instanz zugreifen, um innerhalb eines bestimmten Bereichs zurückzukehren. Dies ist nützlich, wenn Sie nicht mit Klassen arbeiten, die über Standardkonstruktoren verfügen, diese jedoch auf Anforderungsbasis erstellt werden müssen.

Jersey 2.0 hat als Framework für die Abhängigkeitsinjektion auf HK2 umgestellt, aber leider ist die Migrationsseite (https://jersey.java.net/documentation/latest/migration.html) enthält kein Beispiel für diese Art der Bindung, und die HK2-Dokumentation enthält keine Beispiele für die Verwendung eines AbstractBinders.

Um nur ein bisschen näher darauf einzugehen, versuche ich, meinen Ressourcen ressourcenlokale, containerunabhängige JPA-EntityManager-Instanzen bereitzustellen. Diese müssen aus einer Singleton-Factory-Klasse geholt werden und sollten nur für eine einzelne "Arbeitseinheit" übrig bleiben, was in meinem Fall eine Bitte ist. Ich bin mir bewusst, dass es Workarounds gibt (einfach die Factory injizieren oder an einen Threadlocal binden), aber ich fand die vorherige Lösung elegant und möchte sie nach Möglichkeit neu erstellen.

BEARBEITEN:
Nach einigem Durchstöbern der HK2-Javadocs habe ich festgestellt, dass etwas Ähnliches wie folgt erreicht werden kann:

public class MyInjectableProvider extends AbstractBinder 
        implements Factory<MyInjectable> {
    @Override
    protected void configure() {
        bindFactory(this).to(MyInjectable.class);
    }

    @Override
    public MyInjectable provide() {
        return getMyInjectable();
    }

    @Override
    public void dispose(MyInjectable instance) {}
}

Und um es zu registrieren ...

public class MyResourceConfig extends ResourceConfig {
    public MyResourceConfig() {
        register(new MyInjectableProvider());
    }
}

Dies "scheint zu funktionieren", aber es scheint auch ein bisschen unklar. dispose () wird beispielsweise nie aufgerufen. Außerdem scheint sich diese Bindung implizit wie RequestScoped zu verhalten. Ändern der Konfiguration aufbindFactory(this).to(MyInjectable.class).in(RequestScoped.class); scheint das Verhalten nicht wirklich zu ändern. Vermisse ich etwas oder ist das die beabsichtigte Lösung?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage