Используя Jersey 2.0, как вы регистрируете привязываемый экземпляр для каждого запроса?
... если экземпляр должен быть создан вручную, возможно, сторонним фабричным классом? Ранее (Джерси 1.x) вы делали что-то вроде этого:
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;
}
};
}
}
Анонимный локальный класс может получить доступ к экземпляру для возврата в некоторой области. Это полезно, когда вы не работаете с классами, у которых есть конструкторы по умолчанию, но они должны создаваться для каждого запроса.
Jersey 2.0 переключился на HK2 в качестве среды внедрения зависимостей, но, увы, страница миграции (https://jersey.java.net/documentation/latest/migration.html) не предоставляет пример такого рода привязки, а документация HK2 не содержит примеров, использующих AbstractBinder.
Более подробно, я пытаюсь предоставить ресурсные локальные, независимые от контейнера экземпляры JPA EntityManager для своих ресурсов. Они должны быть извлечены из класса фабрики-одиночки и должны оставаться только для одной «единицы работы», которая является запросом в моем случае. Я знаю, что есть обходные пути (просто введите фабрику или привязайте к локальному потоку), но я нашел предыдущее решение элегантным и хотел бы воссоздать его, если это возможно.
РЕДАКТИРОВАТЬ:
Немного покопавшись в Javadocs HK2, я обнаружил, что нечто подобное можно достичь следующим образом:
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) {}
}
И зарегистрировать это ...
public class MyResourceConfig extends ResourceConfig {
public MyResourceConfig() {
register(new MyInjectableProvider());
}
}
Это "кажется, работает", но это также кажется немного неясным. Например, dispose () никогда не вызывается. Кроме того, эта привязка неявно ведет себя как RequestScoped. Изменение конфигурации дляbindFactory(this).to(MyInjectable.class).in(RequestScoped.class);
не похоже, чтобы на самом деле изменить поведение. Я что-то упустил, или это намеченное решение?