Menggunakan Guice dengan Framework Cloud Endpoints

Google Guice adalah framework injeksi dependensi yang dapat Anda gunakan dengan project Endpoints Frameworks v2 untuk mengonfigurasi pemetaan dan pemfilteran servlet secara terprogram di Java, bukan di web.xml.

Untuk menggunakan Guice, Anda perlu menambahkan dependensi yang dikemas sebelumnya berikut ke pom.xml atau build.gradle. Selain itu, Anda perlu mengonfigurasi plugin Endpoints Frameworks untuk Maven dan Gradle guna menentukan class layanan yang digunakan plugin untuk membuat dokumen 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']
}

Selanjutnya, Anda perlu memperbarui web.xml untuk mengarahkan semua traffic dari /_ah/api/* ke Endpoints Frameworks Guice Servlet.

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

Terapkan class pemroses di project Anda. Tampilannya akan terlihat seperti berikut, bergantung pada jumlah layanan:

public class EchoGuiceListener extends GuiceServletContextListener {

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

Class pemroses membuat injector baru yang menangani pemetaan dan pemfilteran servlet, yang biasanya ditentukan oleh web.xml, tetapi sekarang ditentukan oleh class EchoEndpointModule yang ditentukan sebagai:

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

Apa langkah selanjutnya?