【问题标题】:Guice + Jersey integration injects null objectsGuice + Jersey 集成注入空对象
【发布时间】:2015-09-08 05:15:51
【问题描述】:

按照Up and running on AppEngine with Maven, Jersey and Guice - Part 3 中给出的出色分步操作,除了将对象注入 Jersey POJO 之外,我已经能够让一切正常工作。

我与该配置的唯一区别是我还集成了 Objectify,但这是有效的。

注入HelloWorldServletTestClass 实例(单例)有效,但注入HeyResource POJO 的TestClassSecondTest (RequestScoped) 对象始终为null

我怀疑是 HK2 和 Guice 之间的互动,但这是我与 Guice Jersey HK2 的第一个项目,所以我都在海上.

我的配置是:

  • 平台:Win 7
  • GAE SDK 1.9.26
  • Jave 1.7.0_79
  • 球衣:2.5.1
  • Guice:4.0
  • 对象化:5.1.7
  • HK2 Guice-bridge:2.2.0
  • Maven 3.3.3

【问题讨论】:

  • 我不确定这里是否有足够的信息来给出答案。你能提供你的代码sn-ps吗?

标签: java google-app-engine maven-3 guice jersey-2.0


【解决方案1】:

使用 Jersey 2,您不需要像 Jersey 1 那样使用 Guice 网络包装器。您已经拥有 guice-bridge,您只需在 Jersey 配置中使用 HK2 对其进行配置。见The Guice/HK2 Bridge

你基本上需要得到 HK2 的ServiceLocator 的句柄来绑定两个框架。 Jersey 允许您在应用程序的许多位置注入定位器。您最需要它的地方是配置类(即ResourceConfig)。这是一个如何配置它的示例。

public class JerseyConfig extends ResourceConfig {

    @Inject
    public JerseyConfig(ServiceLocator locator) {
        packages("your.packages.to.scan");

        GuiceBridge.getGuiceBridge().initializeGuiceBridge(locator);
        // add your Guice modules.
        Injector injector = Guice.createInjector(new GuiceModule());
        GuiceIntoHK2Bridge guiceBridge = locator.getService(GuiceIntoHK2Bridge.class);
        guiceBridge.bridgeGuiceInjector(injector);
    }
}

如果您使用 web.xml 来配置应用程序,您可以使用 init-param 将此类添加到您的配置中

<servlet>
    <servlet-name>Jersey Web Application</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>com.*.jersey.JerseyConfig</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

【讨论】: