12

Więc chcę używać Guice w Appengine z Cloud Endpoints do wstrzykiwania moich usług, lub daos - dość powszechne, jak sądzę, ale nie znalazłem tutoriala na ten temat.Appengine z Google Cloud Endpoints i Guice

Dziennik Guice dla AppEngine dokumentacja wydaje się być tutaj: https://github.com/google/guice/wiki/GoogleAppEngine

Podczas konfigurowania Guice skonfigurowaniu com.google.inject.servlet.GuiceFilter przechwycić każdą prośbę „/ *”. I w pewnym momencie musisz zainicjować moduły. Dokumentacja mówi, że dobrym miejscem na to jest ServletContextListener.

Jednym ze specjalnych modułów są ServletModules, które mapują ścieżki-zapytania do klas Servlet, zamiast robić to w web.xml, możesz teraz robić to programowo.

Dość prosto do przodu, aż tutaj. Ale w jaki sposób skonfigurować Guice, aby zawierała również klasy punktów końcowych?

Odpowiedz

26

Okazuje się, że istnieje GuiceSystemServiceServletModule, który obsługuje dokładnie to.

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

Dołącz tego modułu w konstrukcji wtryskiwacza w ServletContextListener:

public class MyGSCL extends GuiceServletContextListener { 

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

i używać tej słuchacza w web.xml:

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

Upewnij się także zawierać filtr Guice w swoim 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> 

Twoje punkty końcowe będą znów dostępne pod/_ah/api/... i możesz użyć @Inject w swoich klasach punktów końcowych.

+1

Jest to ten sam sposób, w jaki korzystamy z naszego mechanizmu obsługi aplikacji. Od wczoraj nie mogłem już aktualizować backendu za pomocą silnika aplikacji w wersji 1.9.17, więc zaktualizowałem go do wersji 1.9.38. Teraz ładuje ale zawsze dobrze się ten błąd: przechwycony wyjątek od serwletu java.lang.NoClassDefFoundError: NL/<..>/<..>/Guice/GuiceSSSModule – Roel

+0

@Roel miałem podobny problem przy użyciu wersji App Engine 1.9.37, ale po czytając twój komentarz, uaktualniłem do 1.9.46, a następnie problem zniknął –

Powiązane problemy