12

所以我想在 Appengine 中使用 Guice 和 Cloud Endpoints 来注入我的服务或 daos——我猜这很常见,但我没有找到这方面的教程。

Appengine 文档的官方 Guice 似乎在这里:https ://github.com/google/guice/wiki/GoogleAppEngine

在配置 Guice 时,您设置 com.google.inject.servlet.GuiceFilter 来拦截每个请求“/*”。在某些时候,您必须初始化模块。就像文档说的那样,一个很好的地方是 ServletContextListener。

一种特殊的模块是 ServletModules,它将请求路径映射到 Servlet 类,而不是在 web.xml 中执行此操作,您现在可以以编程方式执行此操作。

非常直截了当,直到这里。但是如何将 Guice 配置为也包含 Endpoint-Classes?

4

1 回答 1

27

原来有一个 GuiceSystemServiceServletModule 可以处理这个问题。

public class GuiceSSSModule extends GuiceSystemServiceServletModule {

  @Override
  protected void configureServlets() {
    super.configureServlets();

    Set<Class<?>> serviceClasses = new HashSet<Class<?>>();
    serviceClasses.add(MyEndpoint.class);
    serviceClasses.add(AnotherAndpoint.class);
    this.serveGuiceSystemServiceServlet("/_ah/spi/*", serviceClasses);
  }
}

将此模块包含在 ServletContextListener 的 Injector 构造中:

public class MyGSCL extends GuiceServletContextListener {

  @Override
  protected Injector getInjector() {
    return Guice.createInjector(new GuiceSSSModule(), new BaseModule());
  }
}

并在您的 web.xml 中使用此侦听器:

<listener>
   <listener-class>de.mypkg.MyGSCL</listener-class>
</listener>

还要确保在 web.xml 中包含 Guice 过滤器:

<!-- GUICE -->
<filter>
    <filter-name>guiceFilter</filter-name>
    <filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>guiceFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

您的端点将再次在 /_ah/api/... 下可用,并且您可以在端点类中使用 @Inject。

于 2013-06-15T23:02:11.313 回答