12

Bu yüzden, hizmetlerimi enjekte etmek için Appice'de Cloud Endpoint'lerle birlikte enjekte etmek veya sanırım oldukça yaygındı, ama bunun için herhangi bir eğitim bulamadım.Google Cloud Endpoint'ler ve Guice ile Appengine

Resmi Guice AppEngine'de belgeleri burada gibi görünüyor: Guice yapılandırırken

https://github.com/google/guice/wiki/GoogleAppEngine her isteğini "/ *" yolunu kesmek için com.google.inject.servlet.GuiceFilter kurdu. Ve bir noktada modülleri başlatmanız gerekir. Belgelerin yaptığı gibi, bunun için iyi bir yer bir ServletContextListener olduğunu söylüyor.

Bir özel modül olan ServletModules, bu istek-Servlet-Class'ları Yolları, bu bunu web.xml'de yapmak yerine, artık bunu programsal olarak yapabilirsiniz.

Buraya kadar oldukça düz ileriye. Ancak Guice’i Endpoint-Classes’i de içerecek şekilde nasıl yapılandırabilirim?

cevap

26

Tam olarak bunu işleyen bir GuiceSystemServiceServletModule olduğunu ortaya çıkarır.

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

sizin ServletContextListener içinde Enjektör yapımında bu modülü ekleyin:

public class MyGSCL extends GuiceServletContextListener { 

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

ve web.xml''deki bu dinleyici kullanın:

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

Ayrıca Guice filtreyi eklemeyi unutmayın web.xml dosyasında:

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

Bitiş noktalarınız tekrar/_ah/api/... altında olacak ve son nokta sınıflarınızda @Inject kullanabilirsiniz.

+1

Bu, uygulama altyapımızın arka ucunda kullandığımız gibi. Dünden bu yana uygulama motoru sürüm 1.9.17 ile arka uç güncelleme yapamadım, bu yüzden 1.9.38'e yükselttim. Şimdi O yükler ama daima bu hatayı alıyorum: servlet java.lang.NoClassDefFoundError dan Yakalanmayan istisna: nl/<..>/<..>/app motor versiyonu 1.9.37 kullanarak benzer bir sorun vardı guice/GuiceSSSModule – Roel

+0

@Roel ama sonra Yorumunuzu okuyarak 1.9.46'ya yükselttim ve sorun ortadan kalktı –