1

私のプロジェクトには次の問題があります。

次の構成を持つ 2 つのマネージド Bean があります。

@ManagedBean
@SessionScoped
public class SessionBean {
    private PersonnelFile personnelFile; // + getters/setters
}

@ManagedBean
@ViewScoped
public class ViewBean {
    @ManagedProperty("#{sessionBean}")
    private SessionBean sessionBean;

    public void selectPersonnel() {
        sessionBean.getPersonnelFile().setPerson(new Person());
    }
}

これはすべてのコードではありませんが、状況の一般的なアイデアを示しています。

  • セッションオブジェクトを保持する SessionScoped Bean
  • ビュー関連のオブジェクトと SessionScoped Bean への参照を保持する ViewScoped Bean

問題は次のとおりです。

  • ビューにアクセスします
  • 私は同じビューにいくつかのポストバックを行い、毎回ビューに戻ってきます..これまでのところとても良い
  • ある時点で、ビューからの情報を使用して SessionScoped Bean にセッションオブジェクトを設定し、ビューを離れます...これまでのところとても良いです
  • ここで、このビューに戻ると、彼は新しい ViewScoped Bean インスタンスを作成し (予想どおり)、SessionScoped Bean を元に戻します (ManagedProperty アノテーションのため)。
  • これをデバッグすると、SessionScoped Bean への参照が同じままであるため、同じオブジェクトであることがわかります。
  • ただし、以前に SessionScoped Bean に設定したオブジェクトは になりました。これnullは、そのオブジェクトに関するセッション情報を「失った」ことを意味します。
  • SessionScoped Bean でこのオブジェクトをリセットしたことはないので、どこで問題が発生したのかわかりません...

さらに説明が必要な場合、またはこの質問をより適切に表現したい場合は、お知らせいただくか、編集ボタンを使用してください。

4

1 に答える 1

0

@BalusC 問題が見つかった可能性があると思います。web.xml では、次の設定を使用していました。

 <context-param>
     <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
     <param-value>client</param-value>
 </context-param>

さて、私が正しく理解していれば、この設定でビュースコープの Bean を介してセッションスコープの Bean の状態を編集することはできません... セッションスコープの Bean の状態を変更できた唯一の方法、Bean 自体のコンストラクターまたは PostConstruct メソッドにあります。ビュー スコープの Bean 内からセッション スコープの Bean に加えられた変更は、サーバー上で保持されませんでした。

この変数を「サーバー」に設定すると、状態は実際にサーバー上に保持され、毎回クライアントに送信されるわけではありません。clientこれにより、メモリの観点からサーバーの負荷が高くなることは理解していますが、このアプローチを使用して問題を解決する方法を知りたいです。

それで、私の問題は修正されましたが、解決策が理想的かどうかはわかりません...

于 2012-01-11T08:29:00.543 に答える