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、ゲリー
requestScope Managedbeanをバッキングビーンとして使用し、すべてのセッション関連のものを維持し、異なるバッキングBeanで使用できるセッション長のEJBを使用するという要件を管理するにはどうすればよいですか? – gerry
リクエストスコープ管理Beanが再び要件になるのはなぜですか?メモリの問題のために?しかし、マネージドBeanはステートフルBeanへの参照のみを保持します(ステートフルとしてBeanを使用したい場合は必須です)。あなたのメモリの懸念事項は、もしあれば、ステートフルBean自体を参照することができ、実際には軽量の管理対象Beanを参照することはできません。 –
しかし、これが本当に必要条件であれば、目的の動作を達成できます。どうにかしてHttpSessionにSFSBを格納し、インスタンスフィールドとして注入するのではなく、マネージドBeanのgetTable()メソッドでSFSBを検索する必要があります。 –