2010-12-30 5 views
4

GlassFish v3アプリケーションサーバーでJSF 2.0とEJB 3.1を使用しています。
RequestScopeを持つMenagedBeanでは、セッション関連の情報をselecedカテゴリとして保存するセッションオブジェクト(EJBは@Stateful)にアクセスしたいと思います。セレクションされたページ(データテーブル各カテゴリの改行記号など) - 何も特別なものはないと思います。
初めてカテゴリを選択すると、データテーブルが作成されて表示されます。これまでのところ大丈夫。 項目(行)をクリックして(項目の詳細を表示する)、次のページを表示する場合は、セッション(ステートフルEJB)が再作成され、デフォルト値が使用されてページの表示とレンダリングが行われます。RequestScopeでManagedBeanのステートフルEJBを使用する際の問題

@ManagedBean 
@RequestScoped 
public class TableViewBean { 

    @EJB 
    SessionBean session; 

    public DataModel getTable() { 
      return session.getDataModel(); 
     } 

     public SessionBean getSession(){ 
      return session; 
     } 
     public void next() { 
      session.getPaginator().nextPage(); 
      session.resetList(); 
     } 

     public void previous() { 
       session.getPaginator().previousPage(); 
       session.resetList(); 
     } 
     // some other code 
    } 

とセッションEJB:

コードは次のようになります

@Stateful 
public class SessionBean { 

private String selectedType = "Entity"; 

private DataModel dataModel; 
private int rowsPerPage = 5; 
private Paginator paginator; 


public void setSelectedType(String type){ 
    if(!type.equalsIgnoreCase(selectedType)){ 
     selectedType = type; 

     updateService(); 
    } 
    resetList(); 
} 


public void resetList() { 
    dataModel = null; 
} 

public void resetPagination() { 
    paginator = null; 
} 

public int getRowsPerPage() { 
    return rowsPerPage; 
} 

public void setRowsPerPage(int rowsPerPage) { 
    this.rowsPerPage = rowsPerPage; 
    resetList(); 
    resetPagination(); 
} 

public Paginator getPaginator() { 
    if (paginator == null) { 
     paginator = new Paginator(rowsPerPage) { 

      @Override 
      public int getItemsCount() { 
       return selectedService.getCount(); 
      } 

      @Override 
      public DataModel createPageDataModel() { 
       DataModel model = null; 
       if(selectedService != null){ 
        model = new ListDataModel(....); 
       } 
       return model; 
      } 
     }; 
    } 

    return paginator; 

} 

public DataModel getDataModel() { 
    if(dataModel == null){ 
     dataModel = getPaginator().createPageDataModel(); 
    } 

    return dataModel; 
} 

}

私はsessionScopeとにManagedBeanの範囲を変更した場合、すべてが正常に動作しますが、私ドンメモリの問題があるため、このようにはなりません。

私のコードで何が問題なのですか...助けてください。

Greetz、ゲリー

答えて

5

あなたRequestScoped ManagedBeanは(つまり、すべての後に手段をRequestScopedものです)要求ごとに再インスタンス化されます。したがって、各インスタンス化では、新しい SFSBインスタンスが挿入されます。

+0

requestScope Managedbeanをバッキングビーンとして使用し、すべてのセッション関連のものを維持し、異なるバッキングBeanで使用できるセッション長のEJBを使用するという要件を管理するにはどうすればよいですか? – gerry

+0

リクエストスコープ管理Beanが再び要件になるのはなぜですか?メモリの問題のために?しかし、マネージドBeanはステートフルBeanへの参照のみを保持します(ステートフルとしてBeanを使用したい場合は必須です)。あなたのメモリの懸念事項は、もしあれば、ステートフルBean自体を参照することができ、実際には軽量の管理対象Beanを参照することはできません。 –

+0

しかし、これが本当に必要条件であれば、目的の動作を達成できます。どうにかしてHttpSessionにSFSBを格納し、インスタンスフィールドとして注入するのではなく、マネージドBeanのgetTable()メソッドでSFSBを検索する必要があります。 –

関連する問題