12

Also ich möchte Guice in Appengine mit Cloud-Endpunkten zu injizieren meine Dienste, oder daos - ziemlich häufig, denke ich, aber ich habe kein Tutorial dafür gefunden.Appengine mit Google Cloud Endpoints und Guice

Offizielle Guice für appengine Dokumentation scheint hier zu sein: https://github.com/google/guice/wiki/GoogleAppEngine

Wenn Guice Konfigurieren Sie die com.google.inject.servlet.GuiceFilter einrichten jede Anfrage „/ *“ abzufangen. Und irgendwann müssen Sie die Module initialisieren. Wie die Dokumentation sagt, ist das ein ServletContextListener.

Eine spezielle Art von Modul sind ServletModule, die Request-Pfade zu Servlet-Klassen abbilden, anstatt dies in der web.xml zu tun, können Sie dies jetzt programmatisch tun.

Ziemlich geradlinig bis hier. Aber wie konfiguriere ich Guice, um auch die Endpoint-Klassen einzuschließen?

Antwort

26

Stellt sich heraus, gibt es ein GuiceSystemServiceServletModule, das genau dies behandelt.

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

Fügen Sie dieses Modul in der Injector Aufbau in Ihrem ServletContextListener:

public class MyGSCL extends GuiceServletContextListener { 

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

und diese Zuhörer in Ihrem web.xml verwenden:

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

Auch stellen Sie sicher, das Guice Filter enthalten in Ihrer 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> 

Ihre Endpunkte sind wieder unter/_ah/api/... verfügbar und Sie können @Inject in Ihren Endpunktklassen verwenden.

+1

Dies ist die gleiche Weise, die wir in unserem App-Engine-Backend verwenden. Seit gestern konnte ich das Backend nicht mehr mit der App Engine Version 1.9.17 aktualisieren, also habe ich auf 1.9.38 upgedated. Jetzt Er lädt aber ich Allways diesen Fehler: abgefangene Ausnahme von Servlets java.lang.NoClassDefFoundError: nl/<..>/<..>/guice/GuiceSSSModule – Roel

+0

@Roel Ich hatte ein ähnliches Problem mit App Engine-Version 1.9.37, aber nach Als ich Ihren Kommentar gelesen habe, habe ich auf 1.9.46 aufgerüstet und das Problem ist dann verschwunden –

Verwandte Themen