12

Google 서비스를 사용하기 위해 Cloud Endpoints가있는 App Engine의 Guice를 사용하고 싶습니다. 꽤 많이 사용되는 것 같습니다.하지만이 가이드는 찾을 수 없습니다.Appengine with Google Cloud Endpoints and Guice

공식 Guice AppEngine에 대한 설명서는 여기에있을 것 같다 : Guice를 구성 할 때

https://github.com/google/guice/wiki/GoogleAppEngine 당신이 모든 요청 "/ *"을 차단하기 위해 com.google.inject.servlet.GuiceFilter을 설정합니다. 그리고 어떤 시점에서 모듈을 초기화해야합니다. 설명서에서 말하는 것처럼 ServletContextListener를 사용하는 것이 좋습니다.

모듈의 특별한 종류 중 하나가 web.xml에서 request-Path를 Servlet-Classes에 매핑하는 ServletModules입니다. 프로그래밍 방식으로이 작업을 수행 할 수 있습니다.

여기까지 꽤 똑바로 앞으로. 하지만 Guice가 Endpoint-Classes도 포함하도록 구성하려면 어떻게해야합니까?

답변

26

정확히 이것을 처리하는 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); 
    } 
} 

는 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를 사용할 수 있습니다.

+1

Google의 앱 엔진 백엔드에서 사용하는 것과 같은 방식입니다. 어제부터 1.9.38로 업그레이드하기 위해 앱 엔진 버전 1.9.17로 백엔드를 더 이상 업데이트 할 수 없었습니다. 지금은 업로드하지만 난에 allways이 오류를 얻을 : 서블릿 java.lang.NoClassDefFoundError가에서 catch되지 않은 예외 : NL/<..>/<..>/I 앱 엔진 버전 1.9.37을 사용하여 비슷한 문제가 있었다 guice/GuiceSSSModule – Roel

+0

@Roel하지만 이후 귀하의 의견을 읽고, 나는 1.9.46로 업그레이 드하고 문제가 사라졌습니다. –

관련 문제