簡體   English   中英

如果注射器是兒童,Jersey-Guice不處理綁定資源?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM