Cloud Endpoints Frameworks で Guice を使用する

Google Guice は、Endpoints Frameworks v2 プロジェクトで使用できる依存性注入フレームワークです。このフレームワークを使用すると、web.xml ではなく Java プログラムでサーブレットのマッピングとフィルタリングを構成できます。

Guice を使用するには、事前にパッケージ化された次の依存関係を pom.xml または build.gradle に追加する必要があります。また、Maven 用と Gradle 用の Endpoints Frameworks プラグインを構成して、これらのプラグインがどのサービスクラスを使って OpenAPI ドキュメントを作成するかを定義する必要もあります。

Maven

<dependency>
      <groupId>com.google.endpoints</groupId>
      <artifactId>endpoints-framework-guice</artifactId>
      <version>2.2.1</version>
    </dependency>

Gradle

compile 'com.google.endpoints:endpoints-framework-guice:2.0.9'
endpointsServer {
      // Endpoints Framework Plugin server-side configuration
      hostname = "${projectId}.appspot.com"
      serviceClasses = ['com.example.echo.Echo']
    }

次に、/_ah/api/* からのすべてのトラフィックを Endpoints Frameworks Guice サーブレットに転送するように web.xml を更新する必要があります。

<filter>
        <filter-name>guiceFilter</filter-name>
        <filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
    </filter>

    <!--
      URL Pattern /_ah/api/* instead of /* because a legacy v1 servlet uses
      the route /_ah/api/ and using /* will erronously use the legacy v1
      servlet instead of routing to your API.
    -->
    <filter-mapping>
        <filter-name>guiceFilter</filter-name>
        <url-pattern>/_ah/api/*</url-pattern>
    </filter-mapping>

    <listener>
        <listener-class>com.example.echo.EchoGuiceListener</listener-class>
    </listener>

プロジェクトにリスナークラスを実装します。これは、サービスの数に応じて次のようになります。

public class EchoGuiceListener extends GuiceServletContextListener {

      @Override
      protected Injector getInjector() {
        return Guice.createInjector(new EchoEndpointModule());
      }
    }

リスナークラスがサーブレット マッピングとフィルタリングを処理する新しいインジェクタを作成します。これは通常、web.xml で定義されていますが、ここでは、次のような EchoEndpointModule クラスで定義されています。

public class EchoEndpointModule extends EndpointsModule {
      @Override
      public void configureServlets() {
        super.configureServlets();

        bind(ServiceManagementConfigFilter.class).in(Singleton.class);
        filter("/_ah/api/*").through(ServiceManagementConfigFilter.class);

        Map<String, String> apiController = new HashMap<String, String>();
        apiController.put("endpoints.projectId", "YOUR-PROJECT-ID");
        apiController.put("endpoints.serviceName", "YOUR-PROJECT-ID.appspot.com");

        bind(GoogleAppEngineControlFilter.class).in(Singleton.class);
        filter("/_ah/api/*").through(GoogleAppEngineControlFilter.class, apiController);

        bind(Echo.class).toInstance(new Echo());
        configureEndpoints("/_ah/api/*", ImmutableList.of(Echo.class));
      }
    }

次のステップ