我正在使用 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/