繁体   English   中英

泽西岛和Google Guice集成

[英]Jersey and Google Guice integration

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

我需要将Jersey与Guice集成在一起。 是否需要注册Guice for Jersey才能以某种方式使用它? 我是否可以仅启用注入并在我想要的任何地方(常规类,过滤器,处理程序,服务,DAO等)进行注入? 为什么我不能像JavaSE应用程序那样仅配置guice,而需要使用ServletModule?

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

谢谢

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

Guice文档中

该模块设置请求和会话作用域,并提供从中配置过滤器和servlet的地方。

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

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

一个简单的例子。 我使用此代码初始化要在其中注入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时创建注入器,这取决于您的首选项和应用程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM