0

I didn't found a good answer so this problem. Maybe I just need to understand how to handle it. I implemented via contextMenu a menuItem to delete selected rows. That doesn't work anymore. Furthermore the editing does not working anymore. I have implemented a row editor. When I click on it, it gets activated and i can start editing but when I press okay or abort nothing happens.

No method is getting called. Not for deleting, not for editing, not even for selecting. It has obviously something to do with the lazyDataModel but how can I change it.

My Controller:

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

The .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>

Model (Telefonbuch):

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 Version 6.2

JSF MyFaces Version 2.2.12

Java 1.8

Spring Boot 2.1.2

enter image description here

CptDayDreamer
  • 1,526
  • 6
  • 25
  • 61
  • 1
    Which versions of PF and JSF do you use? Please edit your question to provide a [mcve] – Selaron Feb 21 '19 at 15:06
  • @Selaron sorry added them. – CptDayDreamer Feb 21 '19 at 15:13
  • This is not a [mcve]... – Kukeltje Feb 21 '19 at 15:54
  • @Kukeltje I will never understand then. I read this and think it's ok. But it's not. What is missing in your eyes? – CptDayDreamer Feb 21 '19 at 15:55
  • All that is missing is described in [mcve]. Small additions are in https://www.stackoverflow.com/tags/jsf/info. And also read http://idownvotedbecau.se/nomcve/ (I did not downvote... yet) – Kukeltje Feb 21 '19 at 16:05
  • @Kukeltje I really hope it's better now. I still have no idea how to handle my problem. – CptDayDreamer Feb 21 '19 at 16:40
  • Like i thought sorting was only my bad. I implemented it different. Working now with LazyDataModel. But still not method get called. Not selection, not delete, not onRowEdit... – CptDayDreamer Feb 21 '19 at 17:59
  • Possible duplicate of [java.lang.UnsupportedOperationException: getRowData(String rowKey) must be implemented when basic rowKey algorithm is not used](https://stackoverflow.com/questions/29816172/java-lang-unsupportedoperationexception-getrowdatastring-rowkey-must-be-imple) – Selaron Feb 21 '19 at 19:09
  • I bet you find this `UnsupportedOperationException` in your logs ;-) – Selaron Feb 21 '19 at 19:09
  • @Selaron sadly you bet wrong... I wish there would be an exception or log to explain me why this happens, but there is nothing. I click the buttons or do something and wait for my IDE to go into the debug mode, but the method doesn't get called. But I will still try what you sent me – CptDayDreamer Feb 21 '19 at 23:57
  • To bad - nevertheless its mandatory to implement `getRowKey` and `getRowData` with lazyModel and selection enabled. But as exception is not thrown (or just not logged?) there might be an additional issue. – Selaron Feb 22 '19 at 07:15
  • @CptDayDreamer Scale down this example to a minimal example that can be run that reveals the issue in question. That is - scale down the model and page to a bare minimal. I see a number of issues, you need to implement the rowkey and place your backing bean in the right scope - but your example does not even reveal the scope of the backing bean. If you do this (and the example can be easily copied and run), we will be able to help you. – Adam Waldenberg Feb 22 '19 at 10:46
  • @AdamWaldenberg I edited it again now. I don't see a bare of issues. I implemented a rowKey and rowData now. And added the scope. Am I wrong or don't you have now everything you need? Still nothing works – CptDayDreamer Mar 01 '19 at 14:55
  • Update: when I delete the selectionMode and selection I can finally edit my entries again. But the problem now is that I want to call via contextMenu the deletion of a row but of course it doesn't work anymore. – CptDayDreamer Mar 04 '19 at 09:56

0 Answers0