2011-01-27 8 views
2

(maven centralからの)Guice 3.0-rc2とそのサーブレット拡張を使用するようにservlet-projectを移行しようとしています。Guice Servlet Extensionでcontext.getNamedDispatcherを使用する方法

Guiceはweb.xmlを基本的に役に立たないようにレンダリングしているので、私は自分のサーブレット名をどこで定義するか分かりません。コードベースではServletContext#getNamedDispatcher("name")が非常に重いので、できるだけ変更したくありません。最初のコードベースはgetNamedDispatcherを1回しか使用していなかったので、私はそれを回避することができました。

問題のサーブレットはいずれのパスもリッスンしていないため、getRequesetDispatcherを使用してはなりません。

誰にも提案はありますか?

答えて

0

guiceがしようとしている大きな問題の1つは、信頼性の低いString識別子の使用から、実際のJava型の使用に移ることです。 guice-servlet管理サーブレットには名前がありますが(toString()Keyのようにバインドされています)、ServletContextはそれらを認識しているとは思いません。あなたのために働くかもしれ

一つのオプションは、実際にあなたがに要求を渡すことができるようにしたいと、直接自分でそれを行うサーブレット(複数可)注入することである。このため

@Singleton 
public class TestServlet extends HttpServlet { 
    private final TestServlet2 testServlet2; 

    @Inject public TestServlet(TestServlet2 testServlet2) { 
    this.testServlet2 = testServlet2; 
    } 

    @Override 
    protected void doGet(HttpServletRequest httpServletRequest, 
         HttpServletResponse httpServletResponse) 
     throws ServletException, IOException { 
    testServlet2.doGet(httpServletRequest, httpServletResponse); 
    } 
} 

が動作するように、あなたが必要なのですか ServletModuleにサーブレットを登録するには... serve("").with(TestServlet2.class)とすれば、どのURLにもマッピングしないようにすることができます。

+0

申し訳ありませんが、これは私にとってはうまくいかないでしょう。サーブレットの名前を決定/割り当てする方法が特に必要です。サーブレットは、ルーティングルールエンジンの一部でもあります。 – msung

+0

@msung:これは、リクエストをいくつかのフィルタを介してサーブレットなどにルーティングすることを伴うと思いますか?もしそうでなければ、一つのオプションはサーブレットを(以前はweb.xmlにあったのと同じ名前の) 'MapBinder'を使ってバインドしていて、' RequestDispatcher'を使うのではなく 'Map'で探していました。 。さもなければ、私はあなたが望むものはおそらくguice-servletが行うように設計されている範囲外であると思います。 – ColinD

+0

以前に使用したサーブレット名をクラスにマッピングすることで問題を回避しました。私が知る限り、サーブレットを調べることはできます。あなたの例でメソッド注入を使用した理由はありますか?サーブレットを直接注入するか、getInstance(YourServlet.class)が機能しないか – msung

関連する問題