Menggunakan Guice dengan Framework Cloud Endpoints

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

Untuk menggunakan Guice, Anda perlu menambahkan dependensi dalam bentuk paket berikut ke pom.xml atau build.gradle. Selain itu, Anda perlu mengonfigurasi plugin Framework Endpoint untuk Maven dan Gradle, agar dapat menentukan class layanan mana 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 harus mengupdate 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>

Implementasikan class pemroses dalam project Anda. ID tersebut akan terlihat seperti berikut, bergantung pada jumlah layanannya:

public class EchoGuiceListener extends GuiceServletContextListener {

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

Class pemroses membuat injektor baru yang menangani pemetaan dan pemfilteran servlet, yang biasanya ditentukan oleh web.xml, tetapi kini 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?