【问题标题】:Jersey and Google Guice integrationJersey 和 Google Guice 的集成
【发布时间】:2016-04-11 17:17:20
【问题描述】:

我的问题是:为什么在创建部署在某种 servlet 容器(如 jetty 或 tomcat)上的应用程序时,我需要在执行 JavaSE 应用程序和 ServletModule 时创建 AbstractModule?它们之间有什么区别?

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

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

谢谢

【问题讨论】:

    标签: java dependency-injection jersey integration guice


    【解决方案1】:

    AbstractModule 是 Guice 引导(配置)阶段的基本构建块。你总是需要其中的一个或多个。另一方面,ServletModule 是一种专业化,可以为您进行一些配置,因为它在 servlet 容器中运行。

    来自Guice documentation

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

    关于 Guice-Jersey 集成,您当然需要进行设置。它不会突然出现。 Guice 与任何其他依赖注入框架一样,在 它可以控制构建您的对象 时工作。如有疑问,请问问自己是谁创建了对象。

    对于 Jersey 和一般的 JAX-RS,谁来创建对象?不是你,你只是定义它们。容器创建它们。 JAX-RS 运行时。在您的情况下,泽西运行时。 Jersey 内部使用 HK2 依赖注入框架。因此,您需要桥接这两个框架,以便注入您使用一些 Guice 资源定义的 JAX-RS 类。或者反过来!这就是为什么有HK2-guice bridge 的原因。因此,Jersey 将使用 HK2 构建您的对象,并且 HK2 也会在 Guice 上查找您的资源,这要归功于桥。

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

    @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 中提取Guice 注入器。或者您可以将注入器添加到其他地方的ServletContext。或者只是在初始化 REST API 时创建注入器,这取决于您的偏好和应用程序。

    【讨论】:

    • 谢谢,现在看起来更清楚了;所以基本上,例如,jax-rs 资源(端点)是由 HK2 在内部创建的,我的工作是告诉 jax-rs 使用 guice 创建它们?顺便说一句,您有任何集成的工作示例吗?昨天我尝试了我在网上找到的每一个,但没有人帮助我.. 仍然是空指针
    • 更新了一个例子。不,HK2 仍在创建对象,但现在它不仅在其注册表中查找资源,还在 Guice 上查找资源。希望现在更清楚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    • 1970-01-01
    • 1970-01-01
    • 2011-06-10
    相关资源
    最近更新 更多