java - 如果注入(inject)器是 child ,Jersey-Guice 不会处理绑定(bind)资源?

标签 java jersey guice

我正在使用 Jersey-Guice 配置一个 Jersey 应用程序,遵循 template .如果 GuiceServletContextListener.getInjector() 方法返回的 Injector 是由 Guice.createInjector() 创建的,则一切正常。如果该注入(inject)器是另一个注入(inject)器的子注入(inject)器,则绑定(bind)资源(例如,下面代码中的 MyResource)永远不会添加到 Jersey ResourceConfig 并且 Jersey 崩溃并显示提示缺少根资源。我认为绑定(bind)的资源甚至都没有被扫描,因为日志中没有出现通常的“信息:将 my.example.MyResource 注册为根资源类”。

知道为什么会发生这种情况吗?两个版本如下所示。

作为一个附加问题:我正在尝试使用子注入(inject)器,因为我想在我的 Main() 类中配置我的应用程序数据服务对象。不仅仅是 Jersey 资源需要访问它。我仍然需要将它注入(inject) Jersey 资源。

如果有更好的方法在应用程序注入(inject)器和 servlet 注入(inject)器之间共享应用程序单例(比我目前将 servlet 注入(inject)器作为应用程序注入(inject)器的子项的方法更好),请告诉我。

这个版本有效。

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);
             }
         });
     }
 }

最佳答案

我在使用调试器玩了一会儿之后弄明白了。

资源是通过迭代注入(inject)器的绑定(bind)来发现的,检查那些是资源或提供者。使用的注入(inject)器通过构造函数注入(inject)到 GuiceContainer 中,如下所示:public GuiceContainer(@Inject injector)。由于没有在子注入(inject)器中指定 GuiceContainer.class 的显式绑定(bind),父(即根)注入(inject)器用于创建实例(我猜是即时绑定(bind)),因此父(而不是子)注入(inject)器是注入(inject)到 GuiceContainer 实例中。

修复很简单:

在子注入(inject)器中显式绑定(bind) 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);
             }
         });
     }
 }

关于java - 如果注入(inject)器是 child ,Jersey-Guice 不会处理绑定(bind)资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8454647/

相关文章:

java - 在 Java 中实现缓存以实现读取性能且完全不驱逐

java - 在jsp中将编辑按钮保存在相同的表单上

java - 在本地服务器上部署可运行的jar

java - 在 Jersey 中解析复杂的 JSON 类型

javax.ws.rs.NotSupportedException : Could not find message body reader for type: class com. sun.jersey.core.header.FormDataContentDisposition

GWT Acegi 替代品

java - 我想显示数据库 JAVA Jframe 中的用户名

java - 如何检查除一个之外的所有数组值是否相同?

java - 如何从 ContainerRequestContext 获取表单数据参数

java - 作为身份功能实现的 Guice-Provider 如何工作?