Guice mit Cloud Endpoints Frameworks verwenden

Google Guice ist ein Abhängigkeitsinjektions-Framework, das Sie zusammen mit einem Projekt von Endpoints Frameworks Version 2 verwenden können, um die Servlet-Zuordnung und -Filterung programmatisch in Java statt in web.xml zu konfigurieren.

Wenn Sie Guice verwenden möchten, müssen Sie die folgende vordefinierte Abhängigkeit zu pom.xml oder build.gradle hinzufügen. Außerdem müssen Sie die Endpoints Frameworks-Plug-ins für Maven und Gradle konfigurieren, um festzulegen, welche Dienstklassen die Plug-ins zum Erstellen von OpenAPI-Dokumenten verwenden.

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']
}

Als Nächstes müssen Sie web.xml aktualisieren, um den gesamten Traffic von /_ah/api/* zum Guice-Servlet von Endpoints Frameworks zu leiten.

<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>

Implementieren Sie die Listener-Klasse in Ihrem Projekt. Je nach Anzahl der Dienste sollte dies in etwa so aussehen:

public class EchoGuiceListener extends GuiceServletContextListener {

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

Die Listener-Klasse erstellt einen neuen Injektor für die Servlet-Zuordnung und -Filterung. Dies wird normalerweise durch web.xml definiert, in diesem Fall jedoch durch die folgende EchoEndpointModule-Klasse:

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));
  }
}

Nächste Schritte