Utiliser Guice avec Cloud Endpoints Framework

Google Guice est un framework d'injection de dépendances qui, associé à un projet Endpoints Frameworks v2, permet de configurer le mappage et le filtrage de servlets par programmation en Java, plutôt que dans web.xml.

Pour utiliser Guice, vous devez ajouter la dépendance préinstallée suivante à pom.xml ou build.gradle. Les plug-ins Endpoints Framework pour Maven et Gradle doivent également être configurés de manière à définir les classes de service utilisées par les plug-ins pour créer des documents 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']
    }

Vous devez ensuite mettre à jour web.xml pour acheminer l'ensemble du trafic depuis /_ah/api/* vers le servlet Guice d'Endpoints Framework.

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

Mettez en œuvre la classe d'écouteur dans votre projet. Elle devrait ressembler à ce qui suit, en fonction du nombre de services :

public class EchoGuiceListener extends GuiceServletContextListener {

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

La classe d'écouteur crée un injecteur qui gère le mappage et le filtrage des servlets. Normalement définie par l'élément web.xml, elle est désormais définie par la classe EchoEndpointModule, qui se présente comme suit :

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

Et ensuite ?