Jsf getRowData和getRowKey从未执行LazyDataModel

Jsf getRowData和getRowKey从未执行LazyDataModel,jsf,primefaces,Jsf,Primefaces,我试过很多事情,我知道。这个线程与另一个线程相关,但现在问题更具体了。我发现方法getRowData()以及如果我实现它getRowKey()不会被调用 我所尝试的: 在我的.xhtml中,我设置了rowKey,一切正常。没有编译器错误。在控制器中,我写下getRowData()。我试图选择一些东西,这会破坏整个页面。二传手没有接到电话。如果我不覆盖getRowData()编译器仍然可以工作 当我尝试在控制器中实现getRowKey()和getRowData()时,它告诉我。。。异常[getRo

我试过很多事情,我知道。这个线程与另一个线程相关,但现在问题更具体了。我发现方法
getRowData()
以及如果我实现它
getRowKey()
不会被调用

我所尝试的:

在我的.xhtml中,我设置了rowKey,一切正常。没有编译器错误。在控制器中,我写下
getRowData()
。我试图选择一些东西,这会破坏整个页面。二传手没有接到电话。如果我不覆盖
getRowData()
编译器仍然可以工作

当我尝试在控制器中实现
getRowKey()
getRowData()
时,它告诉我
。。。异常[getRowKey(T对象)必须由…实现。

然后我尝试实现
SelectableDataModel
,看看是否有任何区别,但没有区别

当我删除
selectionMode
时,整个选择都很好。分页效果很好。编辑列也很好。但是删除条目所需的上下文菜单不起作用

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}" 
                         editable="true" 
                         resizableColumns="true" 
                         liveResize="true" 
                         style="margin-bottom:20px" 
                         paginator="true" 
                         rows="#{telefonbuchList.pageSize}" 
                         emptyMessage="Keine Telefonbucheinträge vorhanden" 
                         selectionMode="single"
                         selection="#{telefonbuchList.selectedEntry}" 
                         rowKey="#{telefonbuch.id}"
                         currentPageReportTemplate="{startRecord}-{endRecord} von {totalRecords}"
                         paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}"
                         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:ajax event="rowSelect" listener="#{telefonbuchList.onRowSelect}" 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 exportable="false" 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">   
                <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>

        </p:panel>
    </h:form>
  • PrimeFaces版本6.2

  • JSF MyFaces版本2.2.12

  • Java 1.8

  • 弹簧靴2.1.3
在您的方法中

TelefonbuchListController.loadData() {
    lazyModel = new LazyDataModel<Telefonbuch>() {
     //...
    }
您在问题中提出的两种方法
getRowKey
getRowData
都属于
LazyDataModel
实现,该实现未分配给
p:dataTable
value
属性。因此,这两种方法都不会被调用。如果是分配给
p:dataTable
LazyDataModelode>value属性,您的
p:dataTable
可能看起来像这样:

public void loadData() {
    lazyModel = new LazyDataModel<Telefonbuch>() {

        // ...

        @Override
        public Telefonbuch getRowData(String rowKey) {
            // your implementation here
        }

        @Override
        public Object getRowKey(Telefonbuch telefonbuch) {
            // your implementation here
        }

        // ...

}
<p:dataTable id="table"
    var="telefonbuch" 
    lazy="true" 
    widgetVar="tableWv" 
    value="#{telefonbuchList}" 
...
我想这也是我的解决方案,但有人能解释一下这是什么意思吗:
jobRequestController.lazyModel是应该实现这种方法的数据模型,而不是jobRequestController本身
对我来说,这将是一个不同的控制器名,但同样的问题。那么如何实现它呢?
public void loadData() {
    lazyModel = new LazyDataModel<Telefonbuch>() {

        // ...

        @Override
        public Telefonbuch getRowData(String rowKey) {
            // your implementation here
        }

        @Override
        public Object getRowKey(Telefonbuch telefonbuch) {
            // your implementation here
        }

        // ...

}
<p:dataTable id="table"
    var="telefonbuch" 
    lazy="true" 
    widgetVar="tableWv" 
    value="#{telefonbuchList}" 
...