p: выборки dataTable теряются после разбиения на страницы LazyDataModel

Моя проблема в том, что после того, как я выбрал несколько элементов на 1-й странице, если я разбил страницу на другую страницу и вернулся, мои начальные выборы не отображаются. Я пытался реализоватьSelectableDataModel а также с использованиемrowKey атрибут, но проблема сохраняется.

Это мой тестовый боб:

@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
}

Это моя тестовая страница:

<?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>

Буду очень признателен, если вы покажете мне, что я здесь не так сделал.

ОБНОВИТЬ: После того, как я добавил большеSystem.out.println("TEST") В приведенном выше коде я заметил следующие вещи:

На консоли каждый раз, когда я делаю пагинацию,TEST 1: getRowData всегда печатается раньшеTEST 2: load, Как следствие, я считаю, что метод#LazyDataModel.getWrappedData() может вернуть данные со старой страницы. Сначала я подумал, что целью этого метода является получение выбранных строк для выделения на таблице. Однако, если этот метод вызывается раньшеloadнет ли способа сделать работу правильно?После того, как я выбрал первые 2 пункта на первой странице, на консоли я увиделTEST 3: chosenItems's size: 2, Если я перейду на 2-ю страницу, а затем вернусь на 1-ю страницу, выборы будут потеряны, как уже упоминалось. Однако, если я продолжал выбирать другой элемент, на консоли я увиделTEST 3: chosenItems's size: 3, Очевидно, чтоchosenItems В списке все еще хранятся мои старые выборки, но они не отображаются на столе.

Ответы на вопрос(5)

Ваш ответ на вопрос