Данные из <p:dataTable> , полученные из flash scope во время события предварительного просмотра, теряются при разбиении на страницы или сортировке

StackOverflow https://stackoverflow.com/questions/19840634

Вопрос

У меня есть разбиение на страницы и сортировка <p:dataTable>:

<p:dataTable var="item" value="#{reporteIngresosPorExtranetController.detalle}"
    paginator="true" rows="10" paginatorPosition="bottom" rowsPerPageTemplate="5,10,15"
    paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}">
    <p:column sortBy="#{item.user}" headerText="USUARIO:">
        <h:outputText value="#{item.user}" />
    </p:column>
    ...
</p:dataTable>

Его данные извлекаются из области флэш-памяти в @ViewScoped фасоль во время preRenderView событие:

<f:event type="preRenderView" listener="#{reporteIngresosPorExtranetController.cargarDatos}" />
public void cargarDatos() {
    detalle = (List<Map<String, Object>>) FacesUtils.flashScope().get("RIE_detalle");
}

Когда я выполняю разбивку на страницы или сортировку, данные теряются.Чем это вызвано и как я могу это решить?

Это было полезно?

Решение

Вы, кажется, думаете, что preRenderView выполняется только один раз при создании области представления.Это неправильно.Тот Самый preRenderView выполняется во время каждый HTTP-запрос непосредственно перед рендерингом представления (прочтите название события еще раз, теперь оно должно иметь больше смысла, не так ли?).Разбивка на страницы и сортировка выполняются с помощью ajax.Каждый ajax-запрос также считается HTTP-запросом.Время жизни данных в области Flash составляет ровно одно перенаправление.Данные в области Flash больше не доступны при всех последующих запросах, если только они явно не заданы в области flasch еще раз.Таким образом, по сути, ваш метод прослушивания повторно вызывается при каждом запросе разбивки на страницы и сортировки, который эффективно устанавливает detalle Для null.

Избавьтесь от <f:event> в целом и поставить @PostConstruct аннотация к методу.Таким образом, он действительно вызывается только один раз во время создания области просмотра, именно так, как вы и предполагали.

@PostConstruct
public void cargarDatos() {
    detalle = (List<Map<String, Object>>) FacesUtils.flashScope().get("RIE_detalle");
}

Смотрите также:


Не связанный что касается конкретной проблемы, то эта конструкция такова...немного странно.Я бы действительно проконсультировался с более опытным архитектором JSF о том, как правильно выполнить конкретное функциональное требование, для которого вы, возможно, ошибочно полагали, что использование области flash таким образом было бы правильным подходом.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top