Cloud Endpoints 프레임워크에 Guice 사용

Google Guice는 종속 항목 주입 프레임워크로, Endpoints 프레임워크 v2 프로젝트에서 servlet 매핑과 필터링을 web.xml이 아닌 자바에서 프로그래매틱 방식으로 구성하는 데 사용할 수 있습니다.

Guice를 사용하려면 pom.xml 또는 build.gradle에 다음과 같은 사전 패키징된 종속 항목을 추가해야 합니다. 또한 Maven 및 Gradle용 Endpoints 프레임워크 플러그인도 구성하여 플러그인이 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']
}

그런 다음 /_ah/api/*의 모든 트래픽을 Endpoints 프레임워크 Guice 서블릿으로 전달하도록 web.xml을 업데이트해야 합니다.

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

프로젝트에서 리스너 클래스를 구현합니다. 서비스 수에 따라 다음과 비슷하게 표시됩니다.

public class EchoGuiceListener extends GuiceServletContextListener {

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

리스너 클래스는 서블릿 매핑과 필터링을 처리하는 새로운 인젝터를 생성하며, 이 인젝터는 보통은 web.xml에서 정의되지만 지금은 다음과 같이 정의되는 EchoEndpointModule 클래스에 의해 대신 정의됩니다.

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

다음 단계