Используя Jersey 2.0, как вы регистрируете привязываемый экземпляр для каждого запроса?

... если экземпляр должен быть создан вручную, возможно, сторонним фабричным классом? Ранее (Джерси 1.x) вы делали что-то вроде этого:

public class MyInjectableProvider extends PerRequestTypeInjectableProvider {
    public MyInjectableProvider() {
        super(MyInjectable.class);
    }

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

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

Анонимный локальный класс может получить доступ к экземпляру для возврата в некоторой области. Это полезно, когда выМы не работаем с классами, которые имеют конструкторы по умолчанию, но их нужно создавать для каждого запроса.

Jersey 2.0 переключился на HK2 в качестве среды внедрения зависимостей, но, увы, страница миграции (https://jersey.java.net/documentation/latest/migration.html) неt пример такого связывания, а документация HK2 неt привести примеры с использованием AbstractBinder.

Чтобы уточнить чуть больше, яя пытаюсь предоставить ресурсные локальные, независимые от контейнера экземпляры JPA EntityManager моим ресурсам. Они должны быть получены из фабричного класса-синглтона и должны оставаться только один "единица работы " что является просьбой в моем случае. Я'Я знаю, что есть обходные пути (просто введите фабрику или привязайте к локальному потоку), но я нашел предыдущее решение элегантным и хотел бы воссоздать его, если это возможно.

РЕДАКТИРОВАТЬ:

Немного покопавшись в Javadocs HK2, яМы обнаружили, что нечто подобное может быть достигнуто следующим образом:

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

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

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

И зарегистрировать это ...

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

Это "кажется, работает " но это также кажется немного неясным. Например, dispose () никогда не вызывается. Кроме того, эта привязка неявно ведет себя как RequestScoped. Изменение конфигурации дляbindFactory(this).to(MyInjectable.class).in(RequestScoped.class); Безразлично»Похоже, на самом деле изменить поведение. Я что-то упустил или это намеченное решение?

Ответы на вопрос(1)

Ваш ответ на вопрос