После добавления LazyDataModel Editing и Delete не работают

Я не нашел хорошего ответа, поэтому эта проблема. Может быть, мне просто нужно понять, как с этим справиться. Я реализовал через contextMenu элемент меню для удаления выбранных строк. Это больше не работает. Кроме того, редактирование больше не работает. Я реализовал редактор строк. Когда я нажимаю на него, он активируется, и я могу начать редактирование, но когда я нажимаю «ОК» или «Прервать», ничего не происходит.

Ни один метод не вызывается. Ни для удаления, ни для редактирования, ни даже для выбора. Очевидно, это как-то связано с lazyDataModel, но как я могу это изменить.

Мой контроллер:

@Scope(value = "session")
@Component(value = "telefonbuchList")
@ELBeanName(value = "telefonbuchList")
@Join(path = "/", to = "/eintraege-liste.jsf")
public class TelefonbuchListController extends LazyDataModel<Telefonbuch> {

    private static final long serialVersionUID = 1L;
    @Autowired
    private TelefonbuchRepository telefonbuchRepository;
    private List<Telefonbuch> selectedEntries;

    private LazyDataModel<Telefonbuch> lazyModel;

    private int pageSize = 5;

    public void deleteEntry() {
        telefonbuchRepository.deleteAll(selectedEntries);
        lazyModel.getWrappedData().removeAll(selectedEntries);
        selectedEntries.clear();
    }

    public LazyDataModel<Telefonbuch> getLazyModel() {
        return lazyModel;
    }

    @Override
    public int getPageSize() {
        return pageSize;
    }

    @Override
    public Telefonbuch getRowData(String rowKey) {
        List<Telefonbuch> list = getWrappedData();

        for (Telefonbuch telefonbuch : list) {
            if (telefonbuch.getId().toString().equals(rowKey)) {
                return telefonbuch;
            }
        }

        return null;
    }

    @Override
    public Object getRowKey(Telefonbuch telefonbuch) {
        return telefonbuch != null ? telefonbuch.getId() : null;
    }

    public List<Telefonbuch> getSelectedEntries() {
        return selectedEntries;
    }

    @Deferred
    @RequestAction
    @IgnorePostback
    public void loadData() {
        lazyModel = new LazyDataModel<Telefonbuch>() {

            private static final long serialVersionUID = 1L;

            @Override
            public List<Telefonbuch> load(int first, int pageSize, String sortField, SortOrder sortOrder,
                    Map<String, Object> filters) {

                List<Telefonbuch> result = new ArrayList<Telefonbuch>();

                if (first == 0) {
                    if (sortField != null && !sortField.isEmpty()) {
                        if (sortOrder.name().equalsIgnoreCase("ascending")) {
                            result = telefonbuchRepository
                                    .findAll(PageRequest.of(first, pageSize, Sort.by(sortField).ascending()))
                                    .getContent();
                        } else if (sortOrder.name().equalsIgnoreCase("descending")) {
                            result = telefonbuchRepository
                                    .findAll(PageRequest.of(first, pageSize, Sort.by(sortField).descending()))
                                    .getContent();
                        }

                    } else {
                        result = telefonbuchRepository.findAll(PageRequest.of(first, pageSize)).getContent();
                    }
                } else {
                    first = first / pageSize;
                    if (sortField != null && !sortField.isEmpty()) {
                        if (sortOrder.name().equalsIgnoreCase("ascending")) {
                            result = telefonbuchRepository
                                    .findAll(PageRequest.of(first, pageSize, Sort.by(sortField).ascending()))
                                    .getContent();
                        } else if (sortOrder.name().equalsIgnoreCase("descending")) {
                            result = telefonbuchRepository
                                    .findAll(PageRequest.of(first, pageSize, Sort.by(sortField).descending()))
                                    .getContent();
                        }
                    } else {
                        result = telefonbuchRepository.findAll(PageRequest.of(first, pageSize)).getContent();
                    }
                }

                return result;
            }
        };

        lazyModel.setRowCount((int) telefonbuchRepository.count()); 
        lazyModel.setPageSize(pageSize);
    }

    public void onCellEdit(CellEditEvent event) {
        Object oldValue = event.getOldValue();
        Object newValue = event.getNewValue();
        telefonbuchRepository.save((Telefonbuch) newValue);
    }

    public void onRowCancel(RowEditEvent event) {

    }

    public void onRowEdit(RowEditEvent event) {
        Object oldValue = event.getObject();
        telefonbuchRepository.save((Telefonbuch) oldValue);
        FacesMessage msg = new FacesMessage("Eintrag geändert",
                ((Telefonbuch) event.getObject()).getVorname() + " " + ((Telefonbuch) event.getObject()).getNachname());
        FacesContext.getCurrentInstance().addMessage("eintraege-list", msg);
    }

    @Override
    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }

    public void setSelectedEntries(List<Telefonbuch> selectedEntries) {
        this.selectedEntries = selectedEntries;
    }

.xhtml:

<h:form id = "eintraegeList">
        <p:panel header = "Liste aller Einträge">

            <p:dataTable id = "table" var = "telefonbuch" lazy = "true" widgetVar = "tableWv" value = "#{telefonbuchList.lazyModel}" stickyHeader = "true" editable = "true" resizableColumns = "true" liveResize = "true" style = "margin-bottom:20px" paginator = "true" rows = "#{telefonbuchList.pageSize}" dynamic = "true" emptyMessage = "Keine Telefonbucheinträge vorhanden" selection = "#{telefonbuchList.selectedEntries}" selectionMode = "multiple" rowKey = "#{telefonbuch.id}"
            currentPageReportTemplate = "{startRecord}-{endRecord} von {totalRecords}"
            paginatorTemplate = "{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink} {Exporters}"
            rowsPerPageTemplate = "5,8,10">
            <f:facet name = "header">
                <p:commandButton id = "toggler" type = "button" value = "Anzeige" style = "float:right" icon = "pi pi-align-justify" />
                <p:columnToggler datasource = "table" trigger = "toggler" />    
            </f:facet>

            <p:ajax event = "rowEdit" listener = "#{telefonbuchList.onRowEdit}" update = "table" />
            <p:ajax event = "rowEditCancel" listener = "#{telefonbuchList.onRowCancel}" update = "table" />
            <p:ajax event = "cellEdit" listener = "#{telefonbuchList.onCellEdit}" update = "table" />

            <p:separator />

                <p:column headerText = "ID" sortBy = "#{telefonbuch.id}">
                    <h:outputText value = "#{telefonbuch.id}" />
                </p:column>
                <p:column headerText = "Vorname" sortBy = "#{telefonbuch.vorname}">
                    <p:cellEditor>
                        <f:facet name = "output"><h:outputText value = "#{telefonbuch.vorname}" /></f:facet>
                        <f:facet name = "input"><p:inputText id = "vornameInput" value = "#{telefonbuch.vorname}" style = "width:100%"/></f:facet>
                    </p:cellEditor>
                </p:column>
                <p:column headerText = "Nachname" sortBy = "#{telefonbuch.nachname}">
                    <p:cellEditor>
                        <f:facet name = "output"><h:outputText value = "#{telefonbuch.nachname}" /></f:facet>
                        <f:facet name = "input"><p:inputText id = "nachnameInput" value = "#{telefonbuch.nachname}" style = "width:100%"/></f:facet>
                    </p:cellEditor>
                </p:column>
                <p:column headerText = "Telefonnummer" sortBy = "#{telefonbuch.telefonnummer}">
                    <p:cellEditor>
                        <f:facet name = "output"><h:outputText value = "#{telefonbuch.telefonnummer}" /></f:facet>
                        <f:facet name = "input"><p:inputText id = "telefonnummerInput" value = "#{telefonbuch.telefonnummer}" style = "width:100%"/></f:facet>
                    </p:cellEditor>
                </p:column>
                 <p:column headerText = "Handynummer" sortBy = "#{telefonbuch.handynummer}">
                    <p:cellEditor>
                        <f:facet name = "output"><h:outputText value = "#{telefonbuch.handynummer}" /></f:facet>
                        <f:facet name = "input"><p:inputText id = "handynummerInput" value = "#{telefonbuch.handynummer}" style = "width:100%"/></f:facet>
                    </p:cellEditor>
                </p:column>
                 <p:column headerText = "Geschäftsstelle" sortBy = "#{telefonbuch.geschaeftsstelle}">
                    <p:cellEditor>
                        <f:facet name = "output"><h:outputText value = "#{telefonbuch.geschaeftsstelle}" /></f:facet>
                        <f:facet name = "input">
                            <p:selectOneMenu value = "#{telefonbuch.geschaeftsstelle}" style = "width:100%">
                                <f:selectItems value = "#{telefonbuchController.geschaeftsstellen}" var = "c" itemLabel = "#{geschaeftsstelle}" itemValue = "#{geschaeftsstelle}"/>
                            </p:selectOneMenu>
                        </f:facet>
                    </p:cellEditor>
                </p:column>
                <p:column headerText = "Geschlecht" sortBy = "#{telefonbuch.gender.shortGender}">
                    <p:cellEditor>
                        <f:facet name = "output"><h:outputText value = "#{telefonbuch.gender.shortGender}" /></f:facet>
                        <f:facet name = "input">
                            <p:selectOneMenu id = "gender" value = "#{telefonbuch.gender}" style = "width:100%">
                                <f:selectItem itemLabel = "Keine Angabe" itemValue = "" />
                                <f:selectItems value = "#{telefonbuch.genders}" var = "gender" itemLabel = "#{gender.shortGender}" itemValue = "#{gender}"/>
                            </p:selectOneMenu>
                        </f:facet>
                    </p:cellEditor>
                </p:column>
                <p:column style = "width:20px;text-align:center;">
                    <p:rowEditor />
                </p:column>
            </p:dataTable>

            <p:growl id = "growl" showDetail = "true" for = "eintraege-list">
                <p:autoUpdate />
            </p:growl> 

            <p:separator />

            <p:contextMenu for = "table">
            <h:outputStylesheet library = "webjars" name = "font-awesome/5.7.1/css/fontawesome.min-jsf.css" />
                <p:menuitem value = "Löschen" update = "table" icon = "fas fa-eraser" action = "#{telefonbuchList.deleteEntry}"/>
                <p:menuitem value = "Edit Cell" icon = "pi pi-search" onclick = "PF('tableWv').showCellEditor();return false;"/>  
            </p:contextMenu>

            <h3>Exportieren der Daten</h3>
            <h:commandLink>
                <p:graphicImage value = "/img/icon-pdf.png" />
                <p:dataExporter type = "pdf" target = "table" fileName = "Telefonbuch" />
            </h:commandLink>
        </p:panel>
    </h:form>

Модель (Телефонбух):

public enum Gender {
        MALE("Männlich"), FEMALE("Weiblich");

        private String shortGender;

        private Gender(String shortGender) {
            this.shortGender = shortGender;
        }

        public String getShortGender() {
            return shortGender;
        }
    }

    @Column
    @Enumerated(EnumType.STRING)
    private Gender gender;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column
    private String vorname;

    @Column
    private String nachname;

    @Column
    private String telefonnummer;

    @Column
    private String handynummer;

    @Column
    private String geschaeftsstelle;

PrimeFaces Версия 6.2

JSF MyFaces, версия 2.2.12

Ява 1.8

Весенняя загрузка 2.1.2

После добавления LazyDataModel Editing и Delete не работают

Какие версии PF и JSF вы используете? Измените свой вопрос, указав минимальный воспроизводимый пример

Selaron 21.02.2019 16:06

@Selaron, извините, добавил их.

CptDayDreamer 21.02.2019 16:13

Это не минимальный воспроизводимый пример...

Kukeltje 21.02.2019 16:54

@Kukeltje Тогда я никогда не пойму. Я читаю это и думаю, что это нормально. Но это не так. Чего не хватает в ваших глазах?

CptDayDreamer 21.02.2019 16:55

Все, чего не хватает, описано в минимальный воспроизводимый пример. Небольшие дополнения в stackoverflow.com/tags/jsf/info. А также прочитайте idownvotedbecau.se/nomcve (пока не минусовал...)

Kukeltje 21.02.2019 17:05

@Kukeltje Я действительно надеюсь, что сейчас лучше. Я до сих пор не знаю, как справиться со своей проблемой.

CptDayDreamer 21.02.2019 17:40

Как я думал, сортировка была только моей плохой. Я реализовал это по-другому. Сейчас работает с LazyDataModel. Но метод все еще не вызывается. Не выделение, не удаление, не onRowEdit...

CptDayDreamer 21.02.2019 18:59

Держу пари, вы найдете это UnsupportedOperationException в своих журналах ;-)

Selaron 21.02.2019 20:09

@Selaron, к сожалению, вы ошибаетесь ... Я бы хотел, чтобы было исключение или журнал, чтобы объяснить мне, почему это происходит, но ничего нет. Я нажимаю кнопки или делаю что-то и жду, пока моя IDE перейдет в режим отладки, но метод не вызывается. Но я все равно попробую то, что ты мне прислал

CptDayDreamer 22.02.2019 00:57

К сожалению, тем не менее, обязательно реализовать getRowKey и getRowData с lazyModel и включенным выбором. Но поскольку исключение не генерируется (или просто не регистрируется?), может возникнуть дополнительная проблема.

Selaron 22.02.2019 08:15

@CptDayDreamer Уменьшите этот пример до минимального примера, который можно запустить и который выявляет рассматриваемую проблему. То есть - уменьшить модель и страницу до минимума. Я вижу ряд проблем, вам нужно реализовать rowkey и поместить свой вспомогательный компонент в правильную область, но ваш пример даже не раскрывает область действия вспомогательного компонента. Если вы сделаете это (а пример можно легко скопировать и запустить), мы сможем вам помочь.

Adam Waldenberg 22.02.2019 11:46

@AdamWaldenberg Сейчас я отредактировал это снова. Я не вижу никаких проблем. Я реализовал rowKey и rowData сейчас. И добавил размах. Я ошибаюсь или у вас сейчас нет всего, что вам нужно? Все равно ничего не работает

CptDayDreamer 01.03.2019 15:55

Обновление: когда я удаляю selectionMode и selection, я, наконец, снова могу редактировать свои записи. Но проблема сейчас в том, что я хочу вызвать через contextMenu удаление строки, но это, конечно, больше не работает.

CptDayDreamer 04.03.2019 10:56
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
14
117
0

Другие вопросы по теме