[英]Jersey-Guice doesn't process bound resources if injector is a child?
我正在使用Jersey-Guice來配置Jersey應用程序,遵循此模板 。 如果GuiceServletContextListener.getInjector()
方法返回的Injector
是由Guice.createInjector()
創建的, Guice.createInjector()
一切正常。 如果該注入器是另一個注入器的子節點,那么綁定資源(例如,下面代碼中的MyResource
)永遠不會被添加到Jersey ResourceConfig
並且Jersey會因為缺少根資源而抱怨。 我不認為綁定的資源甚至被掃描,因為通常的“INFO:將my.example.MyResource注冊為根資源類”不會出現在日志中。
任何想法為什么會這樣? 兩個版本如下所示。
另外一個問題:我正在嘗試使用子注入器,因為我想在Main()類中配置我的應用程序數據服務對象。 不僅僅是澤西島資源需要訪問它。 我仍然需要將它注入Jersey資源。
如果有更好的方法在應用程序Injector和servlet注入器之間共享應用程序單例(比我當前的servlet注入器作為應用程序注入器的子進程的方法更好),請告訴我。
這個版本有效。
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);
}
});
}
}
我在調試器玩得很開心之后想出來了。
通過迭代注入器的綁定,檢查那些資源或提供者來發現資源。 使用的注入器通過如下構造函數注入GuiceContainer: public GuiceContainer(@Inject injector)
。 由於沒有對子注入器中指定的GuiceContainer.class進行顯式綁定,因此使用父(即根)注入器來創建實例(我猜是即時綁定),因此父(而不是子)注入器是注入到GuiceContainer實例中。
修復很簡單:
在子注入器中顯式綁定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() {
/* Explicitly bind GuiceContainer so that
* the child, not root, injector is injected
* into its constructor. */
bind(GuiceContainer.class);
bind(MyResource.class);
serve("*").with(GuiceContainer.class);
}
});
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.