Los datos de que se obtienen del alcance flash durante el evento Prerenderview se pierde cuando se realiza la paginación o clasificación

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

Pregunta

Tengo un paginable y ordinario <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>

Sus datos se obtienen del alcance flash en un @ViewScoped frijoles durante el preRenderView evento:

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

Cuando realizo la paginación o la clasificación, los datos se pierden. ¿Cómo se causa esto y cómo puedo resolverlo?

¿Fue útil?

Solución

Pareces pensar que el preRenderView se ejecuta solo una vez durante la creación del alcance de la vista. Esto está mal. los preRenderView se ejecuta durante cada Solicitud HTTP justo antes de representar la vista (lea el nombre del evento una vez más, ahora debería tener más sentido, ¿verdad?). La paginación y la clasificación es realizada por Ajax. Cada solicitud de AJAX también se considera una solicitud HTTP. Los datos con alcance flash tienen una vida de una redirección exactamente. Los datos de alcance flash ya no están disponibles en todas las solicitudes posteriores a menos que se establezcan explícitamente en el alcance de Flasch una vez más. Entonces, básicamente, el método de su oyente se vuelve a invocar en cada solicitud de paginación y clasificación que se establece efectivamente detalle a null.

Deshacerse de <f:event> en total y poner un @PostConstruct Anotación sobre el método. De esta manera, realmente se invoca solo una vez durante la creación del alcance de la vista, exactamente como intentó.

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

Ver también:


No relacionado Para el problema concreto, este diseño es ... un poco extraño. Realmente consultaría a un arquitecto JSF más experimentado sobre cómo lograr adecuadamente el requisito funcional concreto para el cual posiblemente pensó incorrectamente que usar el alcance flash de esta manera sería el enfoque correcto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top