Usando Jersey 2.0, como você registra uma instância ligável por solicitação?

... se a instância precisa ser construída manualmente, talvez por uma classe de fábrica de terceiros? Anteriormente, (Jersey 1.x), você faria algo assim:

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;
            }
        };
    }
}

A classe local anônima é capaz de acessar uma instância para retornar dentro de algum escopo. Isso é útil quando você não está trabalhando com classes que possuem construtores padrão, mas elas precisam ser construídas por solicitação.

Jersey 2.0 mudou para HK2 como uma estrutura de injeção de dependência, mas, infelizmente, a página de migração (https://jersey.java.net/documentation/latest/migration.html) não fornece um exemplo desse tipo de ligação, e a documentação do HK2 não fornece exemplos usando um AbstractBinder.

Para elaborar um pouco mais, estou tentando fornecer instâncias JPA EntityManager de recurso local, agnóstico de container para meus recursos. Eles precisam ser buscados em uma única classe de fábrica, e devem ficar por apenas uma única "unidade de trabalho", o que é uma solicitação no meu caso. Estou ciente de que existem soluções alternativas (basta injetar a fábrica ou vincular a um threadlocal), mas achei a solução anterior elegante e gostaria de recriá-la, se possível.

EDITAR:
Depois de cavar um pouco os javadocs do HK2, descobri que algo semelhante pode ser alcançado da seguinte maneira:

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) {}
}

E para registrá-lo ...

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

Isso "parece funcionar", mas também parece um pouco incerto. dispose () nunca é chamado, por exemplo. Além disso, essa ligação parece se comportar implicitamente como RequestScoped. Modificando a configuração parabindFactory(this).to(MyInjectable.class).in(RequestScoped.class); não parece realmente mudar o comportamento. Estou faltando alguma coisa, ou esta é a solução pretendida?

questionAnswers(1)

yourAnswerToTheQuestion