Используя 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);
Безразлично»Похоже, на самом деле изменить поведение. Я что-то упустил или это намеченное решение?