Я использую Jersey-Guice для настройки приложения на Джерси, следуя этому шаблону .Все работает нормально, если Guice.createInjector()
создает Injector
, возвращенный методом GuiceServletContextListener.getInjector()
.Если этот инжектор является потомком другого инжектора, то связанные ресурсы (например, MyResource
в приведенном ниже коде) никогда не добавляются в Jersey ResourceConfig
, и Jersey аварийно завершает работу с жалобой на отсутствие корневых ресурсов.Я не думаю, что связанные ресурсы даже сканируются, потому что обычное «INFO: Регистрация my.example.MyResource в качестве корневого класса ресурсов» не появляется в журнале.
Любые идеи, почему это может бытьпроисходит?Обе версии показаны ниже.
В качестве дополнительного вопроса: я пытаюсь использовать дочерний инжектор, потому что хочу настроить объект службы данных приложения в моем классе Main ().Больше чем просто ресурсы Джерси нуждаются в доступе к нему.Мне все еще нужно, чтобы это впрыснули в ресурсы Джерси.
Если есть лучший способ разделить синглтон приложения между инжектором приложения и инжектором сервлета (лучше, чем мой нынешний подход к инжектору сервлета, являющегося потомком инжектора приложения), пожалуйста, дайте мне знать.
Эта версия работает.
public class MyConfig extends GuiceServletContextListener {
@Override
protected Injector getInjector() {
return Guice.createInjector(new ServletModule() {
@Override
protected void configureServlets() {
bind(MyResource.class);
serve("*").with(GuiceContainer.class);
}
});
}
}
Однако следующий код не работает.
public class MyConfig extends GuiceServletContextListener {
final Injector parentInjector;
public MyConfig(Injector injector) {
this.parentInjector = injector;
}
@Override
protected Injector getInjector() {
return parentInjector.getChildInjector(new ServletModule() {
@Override
protected void configureServlets() {
bind(MyResource.class);
serve("*").with(GuiceContainer.class);
}
});
}
}