2016-04-11 56 views
1

我的问题是:为什么在创建部署在像jetty或tomcat这样的servlet容器上的应用程序时,在创建JavaSE应用程序和ServletModule时需要创建AbstractModule?他们之间有什么不同?Jersey和Google Guice集成

我需要将Jersey和Guice整合在一起。是否有必要注册Guice的存在让泽西岛以某种方式使用它?我不能只启用注射并在我想要的任何地方执行它们(普通类,过滤器,处理程序,服务,DAO等)?为什么我不能像JavaSE应用程序那样配置guice,而是需要使用ServletModule?

据我在网上看到的,Guice有很多使用HK2服务的例子,反之亦然,所以我可以认为它很重要? (必要?)

由于

回答

4

一种AbstractModule是吉斯的自举(配置)相的基本构建块。你总是需要一个或多个。另一方面,ServletModule是一个专门的,它为你做一些配置,因为它运行在一个servlet容器中。

Guice documentation

此模块建立请求和会话范围,并提供了一个 的地方,从配置过滤器和servlet。

关于Guice-Jersey集成,您当然需要设置它。它不会工作。与任何其他依赖注入框架一样,Guice在时有效,它可以控制构建对象。如果有疑问,问问自己是谁创造了这个物体。

使用Jersey和JAX-RS来创建对象吗?不是你,你只是定义它们。容器创建它们。 JAX-RS运行时。在你的情况下,泽西运行时。泽西岛内部使用HK2依赖注入框架。所以你需要这两个框架,以注入一个JAX-RS类,你已经定义了一些Guice资源。或者相反!这就是为什么有一个HK2-guice bridge。所以泽西岛将使用HK2建造你的物体,HK2也会借助桥梁在Guice上查找你的资源。

一个简单的例子。 I use this code初始化一个REST API,我想注入Guice资源。

@ApplicationPath("api") 
public class ApiRest extends ResourceConfig { 
    private static final Logger log = LoggerFactory.getLogger(ApiRest.class); 

    @Inject 
    public ApiRest(ServiceLocator serviceLocator, ServletContext servletContext) { 
     log.debug("Inicialitzant Jersey."); 
     packages("net.sargue.app.api"); 

     GuiceBridge.getGuiceBridge().initializeGuiceBridge(serviceLocator); 
     GuiceIntoHK2Bridge guiceBridge = serviceLocator.getService(GuiceIntoHK2Bridge.class); 
     Injector injector = (Injector) servletContext.getAttribute(Injector.class.getName()); 
     if (injector == null) 
      throw new RuntimeException("Guice Injector not found"); 
     guiceBridge.bridgeGuiceInjector(injector); 
    } 
} 

请注意,上面的例子中所需要的ServletModule注册为它拉从ServletContext的吉斯注射器。或者您可以将注射器添加到其他地方的ServletContext。或者在初始化REST API时创建注入器,这取决于您的首选项和应用程序。

+0

thx现在看起来更清楚了;所以基本上,例如,jax-rs资源(端点)由HK2在内部创建,我的工作是告诉jax-rs使用guice创建它们。顺便说一句你有任何集成的工作示例?昨天我尝试了我在网上找到的每一个人,没有人帮助我..仍空指针 – azalut

+0

更新了一个例子。不,HK2仍在创建对象,但现在它不仅在注册表中查找资源,而且还在Guice上查找资源。现在希望它更清楚。 – sargue