Jsf 2 来自<;p:dataTable>;在执行分页或排序时,preRenderView事件期间从flash scope获取的数据将丢失

Jsf 2 来自<;p:dataTable>;在执行分页或排序时,preRenderView事件期间从flash scope获取的数据将丢失,jsf-2,primefaces,datatable,flash-scope,prerenderview,Jsf 2,Primefaces,Datatable,Flash Scope,Prerenderview,我有一个可分页和可排序的: <p:dataTable var="item" value="#{reporteIngresosPorExtranetController.detalle}" paginator="true" rows="10" paginatorPosition="bottom" rowsPerPageTemplate="5,10,15" paginatorTemplate="{CurrentPageReport} {FirstPageLink} {Previ

我有一个可分页和可排序的

<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>
public void cargarDatos(){
detalle=(List)FacesUtils.flashScope().get(“RIE_detalle”);
}

执行分页或排序时,数据将丢失。这是如何导致的,我如何解决它?

您似乎认为在创建视图范围期间,
preRenderView
只执行一次。这是错误的。
preRenderView
在呈现视图之前的每个HTTP请求期间执行(再次读取事件名称,现在应该更有意义了,对吧?)。分页和排序由ajax执行。每个ajax请求也被视为HTTP请求。闪存作用域数据的生存期正好是一个重定向。除非再次在flasch作用域中显式设置,否则所有后续请求都不再提供闪存作用域数据。因此,基本上,每次分页和排序请求都会重新调用侦听器方法,从而有效地将
detalle
设置为
null

完全去掉
,并在方法上添加
@PostConstruct
注释。这样,在创建视图作用域期间,它实际上只被调用一次,这完全符合您的意图

@PostConstruct
public void cargarDatos() {
    detalle = (List<Map<String, Object>>) FacesUtils.flashScope().get("RIE_detalle");
}
@PostConstruct
公共空间cargarDatos(){
detalle=(List)FacesUtils.flashScope().get(“RIE_detalle”);
}
另见:


与具体问题无关,本设计是。。。有点奇怪。我真的想咨询一位更有经验的JSF架构师,了解如何正确地实现具体的功能需求,您可能错误地认为这样使用flash scope才是正确的方法。

text已经更正,实际上我使用@ViewScoped
@PostConstruct
public void cargarDatos() {
    detalle = (List<Map<String, Object>>) FacesUtils.flashScope().get("RIE_detalle");
}