Usa Guice con Cloud Endpoints Frameworks

Google Guice es un marco de trabajo de inyección de dependencias que puedes usar con un proyecto de Endpoints Frameworks v2 para configurar la asignación y el filtrado de servlets de manera programática en Java, en vez de en web.xml.

Si quieres usar Guice, debes agregar la siguiente dependencia ya empaquetada a tu pom.xml o build.gradle. Además, debes configurar los complementos de Endpoints Frameworks para Maven y Gradle a fin de definir qué clases de servicios usan los complementos con el propósito de crear documentos de OpenAPI.

Maven

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

Gradle

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

A continuación, debes actualizar web.xml para dirigir todo el tráfico de /_ah/api/* al servlet de Guice de Endpoints Frameworks.

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

Implementa la clase de objeto de escucha en tu proyecto. Debería tener un aspecto similar a lo que se muestra a continuación, según el número de servicios:

public class EchoGuiceListener extends GuiceServletContextListener {

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

La clase de objeto de escucha crea un inyector nuevo que controla la asignación y el filtrado de servlets que se define, por lo general, con web.xml, pero ahora se define con la clase EchoEndpointModule definida, como:

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

Próximos pasos