私は Guice [v3] で動作する Wicket [v6] アプリケーションを持っています。現在、リポジトリ操作に依存性注入を使用しており、セッション スコープ (ユーザーのセッションごとに 1 つ) のサービスを使用するためにそれを使いたいと考えています。公式ドキュメント、さまざまなブログ投稿、ここでの質問を読みましたが、正しいアプローチを使用しているかどうかはわかりません.
2 つの質問があります: 1. 正しい方法を使用していますか? 2. SessionScoped インジェクションに依存するクラスで TestNG テストを実行するには、何か特別なものが必要ですか?
私のセットアップ: web.xml:
<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>
<listener>
<listener-class>com.xxx.CustomServletConfig</listener-class>
MyApplication 初期化:
@Override
protected void init()
{
super.init();
getResourceSettings().setResourcePollFrequency(null);
getMarkupSettings().setStripWicketTags(true);
getDebugSettings().setDevelopmentUtilitiesEnabled(true);
GuiceComponentInjector injector = new GuiceComponentInjector(this, new WebModule(), new GuiceModule());;
}
カスタムサーブレット構成:
public class CustomServletConfig extends GuiceServletContextListener {
@Override
protected Injector getInjector() {
return Guice.createInjector(new GuiceModule(), new WebModule());
}
ウェブモジュール:
public static class WebModule extends ServletModule {
@Override
protected void configureServlets() {
bind(WebApplication.class).toProvider(WicketGuiceAppProvider.class).asEagerSingleton();
bind(IUserService.class).to(UserService.class).in(ServletScopes.SESSION);
Map<String, String> params = new HashMap<String, String>();
params.put(WicketFilter.FILTER_MAPPING_PARAM, "/*");
filter("/*").through(WicketGuiceFilter.class, params);
}
}
私が持っているサンプルページでは:
@Inject
IUserService userService
...
userService.doSomething
単体テスト中の userService.doSomething で、ServletModule のバインディングを指している Guice OutOfScopeException を取得しています: カスタム プロバイダーのエラー、com.google.inject.OutOfScopeException?: スコープ オブジェクトにアクセスできません。現在、HTTP サーブレット リクエスト内にいないか、com.google.inject.servlet.GuiceFilter を適用するのを忘れている可能性があります。このリクエストのサーブレット フィルタとして。
構成は問題なく、別の方法で単体テストを実行する必要があります (WicketTester でアプリケーションを起動しているだけです)、または設計に問題がありますか?