Dados de que são obtidos do escopo do flash durante o evento PrerenderView são perdidos quando a paginação ou a classificação é executada

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

Pergunta

Eu tenho um paginável e classificável <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>

Seus dados são obtidos do escopo do flash em um @ViewScoped feijão durante o preRenderView evento:

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

Quando eu realizo paginação ou classificação, os dados são perdidos. Como isso é causado e como posso resolvê -lo?

Foi útil?

Solução

Você parece pensar que o preRenderView é executado apenas uma vez durante a criação do escopo da visão. Isto está errado. o preRenderView é executado durante todo Solicitação HTTP logo antes de renderizar a visualização (leia o nome do evento mais uma vez, agora deve fazer mais sentido, certo?). A paginação e a classificação são realizadas pelo Ajax. Cada solicitação AJAX também é considerada uma solicitação HTTP. Os dados com escopo flash têm uma vida útil de exatamente um redirecionamento. Os dados com escopo flash não estão mais disponíveis em todas as solicitações subsequentes, a menos que seja explicitamente definido no escopo de Flasch mais uma vez. Então, basicamente, seu método do ouvinte é reinvocado em todas as solicitações de paginação e classificação que efetivamente definem detalle para null.

Livre -se do <f:event> no total e colocar um @PostConstruct anotação no método. Dessa forma, é realmente invocado apenas uma vez durante a criação do escopo da visão, exatamente como você pretendia.

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

Veja também:


Não relacionado Para o problema concreto, esse design é ... meio estranho. Eu realmente consultaria um arquiteto JSF mais experiente sobre como alcançar adequadamente o requisito funcional concreto para o qual você possivelmente pensou incorretamente que o uso do escopo do flash dessa maneira seria a abordagem correta.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top