google framework google-app-engine dependency-injection guice google-cloud-endpoints

google-app-engine - google - endpoints framework



Appengine con Google Cloud Endpoints y Guice (1)

Así que quiero usar Guice en Appengine con Cloud Endpoints para inyectar mis servicios, o daos - bastante común, supongo, pero no encontré tutorial para esto.

La documentación oficial de Guice for Appengine parece estar aquí: https://github.com/google/guice/wiki/GoogleAppEngine

Al configurar Guice, configura com.google.inject.servlet.GuiceFilter para interceptar cada solicitud "/ *". Y en algún momento debe inicializar los módulos. Al igual que la documentación dice que un buen lugar para hacer eso es un ServletContextListener.

Un tipo especial de Módulo son los ServletModules, esa solicitud de mapa: rutas a las clases de servlet, en lugar de hacer esto en el web.xml, ahora puede hacerlo mediante programación.

Muy directo hasta aquí. Pero, ¿cómo configuro Guice para que también incluya las Endpoint-Classes?


Resulta que hay un GuiceSystemServiceServletModule que maneja exactamente esto.

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

Incluya este módulo en la construcción del inyector en su ServletContextListener:

public class MyGSCL extends GuiceServletContextListener { @Override protected Injector getInjector() { return Guice.createInjector(new GuiceSSSModule(), new BaseModule()); } }

y usa este oyente en tu web.xml:

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

También asegúrese de incluir el filtro Guice en su 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>

Sus puntos finales estarán disponibles en / _ah / api / ... nuevamente y puede usar @Inject en sus clases de punto final.