p: las selecciones de la tabla de datos se pierden después de paginar un LazyDataModel

Mi problema es que después de haber seleccionado algunos artículos en la 1ª página, si voy a otra página y vuelvo, no se muestran mis selecciones iniciales. He intentado implementar elSelectableDataModel así como usar elrowKey Atributo pero el problema persiste.

Este es mi frijol de prueba:

@ManagedBean
@ViewScoped
public class MrBean {
    private List<Item> chosenItems;
    private LazyDataModel lazyModel;

    @PostConstruct
    public void prepareTest() {
        this.lazyModel = new LazyItemDataModel();
    }

    public void countItems() {
        System.out.println("TEST 3: chosenItems's size: " + chosenItems.size());
    }

    private class LazyItemDataModel extends LazyDataModel<Item> implements SelectableDataModel<Item> {
        @Override
        public Item getRowData(String rowKey) {
            System.out.println("TEST 1: getRowData");
            Iterator<Item> iter = ((List<Item>) this.getWrappedData()).iterator();
            while (iter.hasNext()) {
                Item item = iter.next();
                if (item.getId().equals(rowKey)) {
                    return item;
                }
            }

            return null;
        }

        @Override
        public Object getRowKey(Item item) {
            return item.getId();
        }

        @Override
        public List<Item> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map filters) {
            System.out.println("TEST 2: load");
            // Code to retrieve items from database
        }
    }

    // Getters and Setters
}

Esta es mi página de prueba:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui">
    <h:head>
        <title>Test page</title>
    </h:head>
    <h:body>
        <h:form>
            <p:dataTable id="itemTable" var="item" value="#{mrBean.items}" rows="5" 
                         paginator="true" selection="#{mrBean.chosenItems}" lazy="true" >

                <p:ajax event="rowSelectCheckbox" listener="mrBean.countItems" />                    

                <p:column selectionMode="multiple" />

                <p:column headerText="ID">
                    <h:outputText value="#{item.id}" /> 
                </p:column>

                <p:column headerText="Name">
                    <h:outputText value="#{item.name}" /> 
                </p:column>

            </p:dataTable>
        </h:form>
    </h:body>
</html>

Estaría muy agradecido si pudieras mostrarme lo que he hecho mal aquí.

ACTUALIZAR: Después agregué másSystem.out.println("TEST") Al código anterior, observé lo siguiente:

En la consola, cada vez que pagino,TEST 1: getRowData siempre se imprime antesTEST 2: load. Como consecuencia, creo que el método.#LazyDataModel.getWrappedData() Puede devolver datos de la página anterior. Al principio, pensé que el objetivo de este método era recuperar las filas seleccionadas para resaltarlas en la tabla. Sin embargo, si este método se llama antesload, no hay manera de que pueda hacer el trabajo bien?Después de seleccionar los primeros 2 elementos en la primera página, en la consola, viTEST 3: chosenItems's size: 2. Si hago una paginación a la segunda página y luego vuelvo a la primera página, las selecciones se pierden como se mencionó. Sin embargo, si continué seleccionando otro elemento, en la consola, viTEST 3: chosenItems's size: 3. Obviamente, lachosenItems La lista aún conserva mis selecciones anteriores, pero no se muestran en la tabla.

Respuestas a la pregunta(5)

Su respuesta a la pregunta