12

App EngineのGuiceをクラウドエンドポイントで使用してサービスを追加したいのですが、それはかなり一般的ですが、私はこれについてのチュートリアルは見つかりませんでした。 AppEngineのドキュメントのGoogle CloudエンドポイントとGuiceを使用したAppengine

公式のGuiceはここにあるように思わ:https://github.com/google/guice/wiki/GoogleAppEngine

のGuiceを設定するときは、すべてのリクエスト「/ *」を傍受するcom.google.inject.servlet.GuiceFilterを設定します。そしてある時点でモジュールを初期化する必要があります。ドキュメントのように、それを行うための良い場所はServletContextListenerです。

モジュールの特別な種類の1つでは、web.xmlでこれを行うのではなく、リクエストパスをServlet-ClassesにマッピングするServletModulesがあります。プログラムでこれを行うことができます。

ここまでまっすぐまっすぐ進みます。しかし、Endpoint-Classesも含めるようにGuiceを構成するにはどうすればよいですか?

答えて

26

正確にこれを処理するGuiceSystemServiceServletModuleがあります。

public class MyGSCL extends GuiceServletContextListener { 

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

とあなたのweb.xmlにこのリスナーを使用します:

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におけるインジェクタの建設にこのモジュールを含める

<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でバックエンドを更新できませんでした。今ではアップロードが、私はオールウェイズこのエラーを取得:NL/<..>/<..>/Guiceの/ GuiceSSSModule – Roel

+0

@Roel私はApp Engineのバージョン1.9.37を使用して同様の問題があったが、後:サーブレット java.lang.NoClassDefFoundErrorがから キャッチされない例外をあなたのコメントを読んで、私は1.9.46にアップグレードし、問題は消えた –

関連する問題