3

私はいくつかのセッションスコープの状態を持っています。それを保持するための最初のアイデアは、セッション スコープのサーブレットでした。だから私はこのようにサーブレットをバインドします

bind(Foo.class).in(ServletScopes.SESSION);

しかし、私は例外を取得します

javax.servlet.ServletException: サーブレットはシングルトンとしてバインドする必要があります。Key[type=Foo, annotation=[none]] はシングルトン スコープにバインドされていませんでした。

では、サーブレットは ServletScopes からスコープを持つことはできませんか? セッション状態を処理する正しい方法は何ですか?

4

2 に答える 2

3

私の理解では、必要なものは何でもセッションスコープにバインドできFooます。問題は、例では のサブクラスのように見えServlet、サーブレットをSingletonスコープにバインドする必要があることです。

これを解決するには、状態( と呼ばれるBar) をセッション スコープにバインドし、FooコンストラクターにProvider<Bar>引数 (Guice によって入力される) を与えるだけで、シングルトン スコープのFooサーブレットからセッション スコープの状態にアクセスできます。

于 2011-02-23T13:39:49.740 に答える
2

サーブレットは Guice ではなく、サーブレット コンテナーによって作成されます。そして、それらはシングルトンです。すべてのクライアントのすべてのリクエストを処理するために、サーブレット コンテナによってインスタンスが 1 つだけ作成されます。

したがって、それらをセッション スコープにバインドしても意味がありません。Guice は、セッションごとに 1 つの異なるサーブレット インスタンスを作成できません。

サーブレットは常にステートレスである必要があります (つまり、その状態はすべてのクライアントに対してグローバルであり、スレッドセーフな方法でアクセスできる必要があります)。

于 2011-02-23T13:38:02.997 に答える