Guice – Jersey – Servlet绑定

我最近切换到两阶段注入,这在我的servlet绑定中创建了一个错误。 我目前正在两种错误模式之间切换,不确定哪种方向最好。

我遇到的第一个错误是:

com.sun.jersey.api.container.ContainerException:ResourceConfig实例不包含任何根资源类。

我的servlet模块看起来像这样:

public class MyServletModule extends JerseyServletModule { @Override protected void configureServlets() { bind(MyServlet.class).asEagerSingleton(); serve("/*").with(GuiceContainer.class); } } 

我能够通过显式提供com.sun.jersey.config.property.packages参数来删除此错误。

 public class MyServletModule extends JerseyServletModule { @Override protected void configureServlets() { bind(MyServlet.class).asEagerSingleton(); Map parameters = new HashMap(); parameters.put(PackagesResourceConfig.PROPERTY_PACKAGES, MyServlet.class.getPackage().getName()); serve("/*").with(GuiceContainer.class, parameters); } } 

但是当我这样做时,Guice会尝试一个Just in Time绑定,它不尊重我的servlet构造函数上的@Inject。

com.google.inject.ConfigurationException:Guice配置错误:

1)无法为MyServlet创建绑定。 它已经在MyServletModule.configureServlets绑定的一个或多个子注入器或私有模块上配置(MyServletModule.java:44)如果它在PrivateModule中,您是否忘记公开绑定? 在找到MyServlet时

com.google.inject.internal.InjectorImpl.getBinding上的1个错误(InjectorImpl.java:150)

我的servlet有一个@Inject构造函数,它的参数不能及时绑定。 在调试InjectorImpl之后,我相信当我使用PROPERTY_PACKAGES时这就是失败的原因。

我只是不确定使用PROPERTY_PACKAGES是否正确,我需要修复一些绑定? 或者,如果这是错误的方向,我需要以不同的方式修复原始的ResourceConfig错误。

感谢帮助或推动正确的方向。

我能够将Jersey资源绑定到Guice而不使用bind-parameters(没有显式提供com.sun.jersey.config.property.packages参数),通过单独绑定资源

 public class BindJerseyResources extends ServletModule { @Override protected void configureServlets() { // excplictly bind GuiceContainer before binding Jersey resources // otherwise resource won't be available for GuiceContainer // when using two-phased injection bind(GuiceContainer.class); // bind Jersey resources PackagesResourceConfig resourceConfig = new PackagesResourceConfig("jersey.resources.package"); for (Class resource : resourceConfig.getClasses()) { bind(resource); } // Serve resources with Jerseys GuiceContainer serve("/*").with(GuiceContainer.class); } } 

资源如下

 @Path("/") @RequestScoped public class Resource { private Storage storage; @Inject public Resource(Storage storage) { this.storage = storage; } @GET @Path("get/{name}") @Produces(MediaType.TEXT_PLAIN) public String getGuid(@PathParam("name") String name) { return storage.get(name); } } 

也许这可以帮助您避免后一个有问题的绑定。


更新了使用两阶段注射的答案。

Java部分

 import com.google.inject.Guice; import com.google.inject.Injector; import com.google.inject.Singleton; import com.google.inject.persist.jpa.JpaPersistModule; import com.google.inject.servlet.GuiceServletContextListener; import com.sun.jersey.guice.JerseyServletModule; import com.sun.jersey.guice.spi.container.servlet.GuiceContainer; import com.sun.jersey.spi.container.servlet.ServletContainer; import com.thjug.apipublic.Echo; public class ServletContextListener extends GuiceServletContextListener { @Override protected Injector getInjector() { final Injector injector = Guice.createInjector(new JerseyServletModule() { @Override protected void configureServlets() { bind(Echo.class); bind(ServletContainer.class).in(Singleton.class); serve("/*").with(GuiceContainer.class); } }, new JpaPersistModule("dbUnit"), new LoggingModule()); injector.getInstance(JPAInitializer.class); return injector; } } 

web.xml中

   API  guiceFilter com.google.inject.servlet.GuiceFilter   guiceFilter /*   Guice Initiate com.thjug.base.ServletContextListener  

以下是关于如何使用Guice进行REST的主题演讲http://www.slideshare.net/nuboat/lightweight-javaee

这是一篇关于如何进行绑定的文章(包括完整的源代码): implementation-distributed-counter