12

Appengine で Guice を Cloud Endpoints と共に使用して、サービスまたは daos をインジェクトしたいと考えています。かなり一般的だと思いますが、これに関するチュートリアルは見つかりませんでした。

Appengine ドキュメントの公式 Guice はこちらのようです: https://github.com/google/guice/wiki/GoogleAppEngine

Guice を構成するときは、com.google.inject.servlet.GuiceFilter を設定して、すべてのリクエスト "/*" をインターセプトします。そして、ある時点でモジュールを初期化する必要があります。ドキュメントにあるように、それを行うのに適した場所は ServletContextListener です。

特別な種類のモジュールの 1 つは ServletModules で、これは request-Path を Servlet-Classes にマップします。web.xml でこれを行う代わりに、プログラムでこれを行うことができます。

ここまではかなりまっすぐ。しかし、エンドポイントクラスも含めるように Guice を構成するにはどうすればよいでしょうか?

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 に答える