Guice + Jersey集成注入空对象

时间:2015-09-08 05:15:51

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

遵循Up and running on AppEngine with Maven, Jersey and Guice - Part 3中给出的优秀分步,除了将对象注入Jersey POJO之外,我已经能够完成所有工作。

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

注入TestClass的{​​{1}}实例(单例)有效,但HelloWorldServletTestClassSecondTest)对象注入{{1} POJO总是RequestScoped

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

我的配置是:

  • 平台:赢7
  • GAE SDK 1.9.26
  • Jave 1.7.0_79
  • 泽西岛:2.5.1
  • Guice:4.0
  • Objectify:5.1.7
  • HK2 Guice-bridge:2.2.0
  • Maven 3.3.3

1 个答案:

答案 0 :(得分:5)

使用Jersey 2,您不需要像使用Jersey 1那样使用Guice Web包装器。您已经拥有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.stackoverflow.jersey.JerseyConfig</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>