問題
私は、Jersey を使用して RESTful API に取り組んでいます。単体テストでオブジェクトのモックを作成できるようにするために、依存性注入フレームワーク Guice (特に Guice-Servlet) を使用します。ServletModule の configureServlet() メソッドをオーバーライドして以下を追加することにより、独自の Filter 実装を介してリクエストをフィルタリングすることができます。
bind(MyFilter.class).in(Singleton.class);
filter("path").through(MyFilter.class);
Tomcat で webapp を実行すると、この MyFilter クラスでリクエストが正しくフィルタリングされます。しかし、私の JUnit テストでは、どのリクエストもフィルタリングされません。誰でも問題を見つけるのを手伝ってもらえますか?
例
- web / WEB-INF / web.xml : Tomcat によって使用されます。パス '/api/*' で ApplicationSetup を GuiceFilter として定義します。
- src / main / java / ApplicationSetup.java : 本番環境 (Tomcat Web サーバー) 用の Guice インジェクターを作成します。ServletModules の 1 つとして ApplicationModule を使用します。
- src / main / java / ApplicationModule.java : パス '/api/*' で MyFilter と Jersey エンドポイントを構成およびバインドする ServletModule。
- src / main / java / endpoints / HelloWorldEndPoint.java : パス '/api/helloworld' にある単純なエンドポイントで、GET 要求のメソッドを使用します。
- src / main / java / MyFilter.java : リクエストがこのフィルタを通過した場合、レスポンスに「Via」ヘッダーを設定します。
- src / test / java / TestApplicationSetup.java : テスト環境 (Grizzly Web サーバー) 用の Guice インジェクターを作成します。ApplicationSetup と同様に、これも ApplicationModule をその ServletModules の 1 つとして使用します。さらに、テスト目的で Grizzly Web サーバーを起動するメソッドがあります。
- src / test / java / TestHelloWorldEndPoint.java : /api/helloworld で GET 要求を実行し、応答の「Via」ヘッダーが MyFilter に設定されているかどうかを確認します。これは失敗します。
ここでの要点は、フィルタをバインドするために両方の環境で使用される ApplicationModule です。例のログを確認すると、両方の環境で MyFilter が初期化されていることがわかります (init() メソッドでの単純な出力)。また、両方の環境で ApplicationModule がサーブレット構成に使用されていることにも気付くでしょう。しかし、どういうわけか、Grizzly Web サーバーはフィルターを無視します。
私はかなり長い間この問題に苦しんできたので、ここでこの質問をするのに時間がかかりました. 誰かがこれで私を助けてくれることを本当に願っています。回避策も高く評価されます。