使用RequestScope在ManagedBean中使用有状态EJB的问题

时间:2010-12-30 13:27:00

标签: session jsf-2 ejb-3.1

我在Glassfish v3应用服务器中使用JSF 2.0和EJB 3.1。而我实际上面临着以下问题:
在带有RequestScope的MenagedBean中,我想访问一个会话对象(带有@Stateful的EJB),它应该存储一些会话相关信息作为选择的类别,选择的页面(每个类别都有一个数据表分页符)等等 - 没什么特别的我认为。
第一次选择类别时,将创建并显示数据表。好吧到目前为止。 现在,如果单击某个项目(行)以显示项目的详细信息,或者是否应显示下一页面,则会重新创建会话(有状态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;
}

}

如果我将ManagedBean的Scope更改为SessionScope,一切正常,但我不喜欢这样,因为使用了内存问题。

我的代码出了什么问题......请帮助我。

格雷茨,格里

1 个答案:

答案 0 :(得分:6)

您的RequestScoped ManagedBean针对每个请求进行了重新实例化(毕竟这是RequestScoped的意思)。因此,在每次实例化时,它都会注入一个 new SFSB实例。