Проблема с использованием Stateful EJB в ManagedBean с RequestScope - PullRequest
4 голосов
/ 30 декабря 2010

Я использую JSF 2.0 и EJB 3.1 на сервере приложений Glassfish v3.И на самом деле я сталкиваюсь с следующей проблемой:
В MenagedBean с RequestScope я хочу получить доступ к объекту сеанса (EJB с @Stateful), который должен хранить некоторую информацию, относящуюся к сеансу, как выбранную категорию, выбранную страницу (спагинация данных для каждой категории) и т. д. - я думаю, ничего особенного.
При первом выборе категории создается и отображается таблица данных.Пока все в порядке.Теперь, если по элементу (строке) щелкают (чтобы показать детали элемента) или если должна отображаться следующая страница, сеанс (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 наSessionScope все работает нормально, но мне это не нравится из-за проблем с памятью.

Что не так с моим кодом ... пожалуйста, помогите мне.

Greetz, Gerry

1 Ответ

6 голосов
/ 30 декабря 2010

Ваш RequestScoped ManagedBean повторно создается для каждого запроса (в конце концов, именно это и означает RequestScoped).Следовательно, с каждым экземпляром он внедряется с новым SFSB экземпляром.

...