1

I have a datatable where one of the columns is editable. As long as i dont use my filter i can navigate through my list and can edit the entry in any row i want. I dont get any errors and my changes are persisted in the DB correctly.

But after i once used any of the filter everything goes sideways. The filter itself works properly.

But when i now try to edit any entry the event.oldValue() from my CellEditEvent is always null and i cant persist my entries.
And only the first page of my paginator is filled with data. Every other page is empty.

Here is the view:

<div class="Container100">
    <p:dataTable paginator="true" rows="15" var="listReportingParticipantOverview" value="#{reportingBean.listReportingParticipantOverview}" 
                 id="participantOverviewId" widgetVar="participantOverviewId"
                 editable="true" editMode="cell" editInitEvent="dblclick"
                 emptyMessage="#{msg['system.no_result']}"
                 filteredValue="#{reportingBean.filteredListReportingParticipantOverview}">
                                 
        <p:ajax event="cellEdit" listener="#{reportingBean.onCellEdit}" update=":reportingForm:msgs"/>
    
        <p:column headerText="#{msg['model.reporting.participant_overview.name']}" filterBy="#{listReportingParticipantOverview.name}" filterMatchMode="contains">
            <h:outputText value="#{listReportingParticipantOverview.name}" />
        </p:column>
        <p:column headerText="#{msg['model.reporting.participant_overview.dateOfBirth']}" filterBy="#{listReportingParticipantOverview.dateOfBirth}" filterMatchMode="contains">
            <h:outputText value="#{listReportingParticipantOverview.dateOfBirth}" />
        </p:column>
        <p:column headerText="#{msg['model.reporting.participant_overview.email']}" filterBy="#{listReportingParticipantOverview.email}" filterMatchMode="contains">
            <p:cellEditor>
                <f:facet name="output">
                    <h:outputText value="#{listReportingParticipantOverview.email}" />
                </f:facet>
                <f:facet name="input">
                    <p:inputText value="#{listReportingParticipantOverview.email}" style="width:100%" label="name"/>
                </f:facet>
            </p:cellEditor>
        </p:column>
    </p:dataTable>
</div>

Here is the bean:

@SessionScoped
@ManagedBean(name = "reportingBean2")
public class ReportingBean2 extends BeanController implements Serializable {

    List<ReportingParticipantOverview> listReportingParticipantOverview = new ArrayList<ReportingParticipantOverview>();
    List<ReportingParticipantOverview> filteredListReportingParticipantOverview;

    ContactRepository contactRepository;
    ContactRepository contactRepositoryOtherDBContext;
    CommunicationRepository communicationRepositoryOtherDBContext;

    private AbstractApplicationContext otherDBContext;

    public void initData() {
        this.listReportingParticipantOverview = this.contactRepositoryOtherDBContext
                .selectParticipantOverviewReporting();
    }

    @PostConstruct
    public void init() {
        otherDBContext = new ClassPathXmlApplicationContext("applicationContext_otherDB.xml");

        this.contactRepository = this.getApplicationContext().getBean(ContactRepository.class);
        this.contactRepositoryOtherDBContext = otherDBContext.getBean(ContactRepository.class);
        this.communicationRepositoryOtherDBContext = otherDBContext.getBean(CommunicationRepository.class);
    }

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

//          ...
    }

    public List<ReportingParticipantOverview> getListReportingParticipantOverview() {
        return listReportingParticipantOverview;
    }

    public void setListReportingParticipantOverview(
            List<ReportingParticipantOverview> listReportingParticipantOverview) {
        this.listReportingParticipantOverview = listReportingParticipantOverview;
    }

    public List<ReportingParticipantOverview> getFilteredListReportingParticipantOverview() {
        return filteredListReportingParticipantOverview;
    }

    public void setFilteredListReportingParticipantOverview(
            List<ReportingParticipantOverview> filteredListReportingParticipantOverview) {
        this.filteredListReportingParticipantOverview = filteredListReportingParticipantOverview;
    }
}
}

I am using Java 8, Eclipse 2021-03 and Primefaces 10.0.0. Any help appreciated :-)

Jasper de Vries
  • 19,370
  • 6
  • 64
  • 102
Josef
  • 77
  • 8
  • I think its a bug in 10.0.0. Can you try 11.0.0-RC1. Lots of Datatable issues resolved. – Melloware Nov 02 '21 at 20:04
  • Thanks for the advice! I tested it and indeed it works now.I developed it according the showcase from the Primefaces website. But i wasnt aware that it was the showcase for 11.0.0-RC1. So i guess i need to remplement it according the older version. – Josef Nov 03 '21 at 11:24

0 Answers0