У меня есть ресурс Джерси с введенным объектом фасада. Это настроено в моем ResourceConfig
, и фасад впрыскивается хорошо. Фасад содержит класс DAO, который также должен быть введен и сконфигурирован в том же ResourceConfig
. Теперь к моей проблеме; класс DAO имеет значение NULL. Таким образом, не вводили.Inject не работает для вложенных объектов [Jersey 2.22.1]
@ApplicationPath("/service")
public class SystemSetup extends ResourceConfig {
public SystemSetup() {
packages(false, "com.foo.bar");
packages("org.glassfish.jersey.jackson");
register(JacksonFeature.class);
final LockManager manager = getLockManager();
final SessionFactory sessionFactory = getSessionFactory();
register(new AbstractBinder() {
@Override
protected void configure() {
bindFactory(InjectFactory.getDaoFactory(sessionFactory)).to(Dao.class).in(Singleton.class);
bindFactory(InjectFactory.getFacadeFactory(manager)).to(Facade.class).in(Singleton.class);
}
});
}
@Path("/")
@Produces("text/json")
public class ViewResource {
@Inject
private Facade logic;
public class Facade {
@Inject
private Dao dao; //Not injected
на заводе экземпляры довольно просты. Они просто вызывают конструктор и передают ему аргумент.
Странная вещь, что это сработало безусловным штрафом, когда я использовал bind (объект класса), а не bindFactory.
EDIT
Фабрики
class InjectFactory {
static Factory<Dao> getDaoFactory() {
return new Factory<Dao>() {
@Override
public Dao provide() {
return new Dao(new Object());
}
@Override
public void dispose(Dao dao) {}
};
}
static Factory<Facade> getFacadeFactory() {
return new Factory<Facade>() {
@Override
public Facade provide() {
return new Facade();
}
@Override
public void dispose(Facade facade) {}
};
}
}
Вы можете разместить весь код, необходимый для воспроизведения проблемы? –
Привет! Я создал очень простой и маленький проект, который воспроизводит эту проблему. Загрузите его на speedy.sh/qbsnJ/Dummy-Project.zip и запустите его с помощью «mvn clean install tomcat7: run-war» и перейдите на localhost: 9090/dummy/service/test в браузере. –
В принципе, все, что вам нужно воспроизвести, - это объект с инъекционным полем (A). Объект A должен содержать другое поле ввода (B). Оба A и B регистрируются как bindFactory (заводской экземпляр). –