我在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,一切正常,但我不喜欢这样,因为使用了内存问题。
我的代码出了什么问题......请帮助我。
格雷茨,格里答案 0 :(得分:6)
您的RequestScoped ManagedBean针对每个请求进行了重新实例化(毕竟这是RequestScoped的意思)。因此,在每次实例化时,它都会注入一个 new SFSB实例。