Регистрация с помощью Google Cloud Endpoints и Guice

Итак, я хочу использовать Guice в Appengine с Cloud Endpoint для ввода моих сервисов, или daos - довольно распространенный, я думаю, но я не нашел для этого учебника.

Официальная инструкция для документации Appengine выглядит здесь: https://github.com/google/guice/wiki/GoogleAppEngine

При настройке Guice вы настраиваете com.google.inject.servlet.GuiceFilter для перехвата каждого запроса "/*". И в какой-то момент вы должны инициализировать модули. Как и в документации, хорошим местом для этого является ServletContextListener.

Одним из специальных типов модулей являются ServletModules, которые сопоставляют запросы-пути к сервлет-классам, вместо того, чтобы делать это в web.xml, теперь вы можете делать это программно.

Довольно прямо вперед, пока здесь. Но как мне настроить Guice, чтобы также включать классы Endpoint?

Ответ 1

Оказывается, существует GuiceSystemServiceServletModule, который обрабатывает именно это.

public class GuiceSSSModule extends GuiceSystemServiceServletModule {

  @Override
  protected void configureServlets() {
    super.configureServlets();

    Set<Class<?>> serviceClasses = new HashSet<Class<?>>();
    serviceClasses.add(MyEndpoint.class);
    serviceClasses.add(AnotherAndpoint.class);
    this.serveGuiceSystemServiceServlet("/_ah/spi/*", serviceClasses);
  }
}

Включите этот модуль в конструкцию Injector в ServletContextListener:

public class MyGSCL extends GuiceServletContextListener {

  @Override
  protected Injector getInjector() {
    return Guice.createInjector(new GuiceSSSModule(), new BaseModule());
  }
}

и используйте этот прослушиватель в вашем web.xml:

<listener>
   <listener-class>de.mypkg.MyGSCL</listener-class>
</listener>

Также включите фильтр Guice в свой web.xml:

<!-- GUICE -->
<filter>
    <filter-name>guiceFilter</filter-name>
    <filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>guiceFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Ваши конечные точки будут доступны снова в /_ah/api/..., и вы можете использовать @Inject в своих классах конечных точек.