Primefaces 可编辑数据表在行编辑时插入自身?

Primefaces editable datatable inserting itself on row edit?

我正在尝试使用 Primefaces 和 java 托管在 Tomcat7 上的数据table 来显示一些公司信息。不幸的是,由于信息敏感,我无法提供有关我正在使用的数据的具体信息。我的代码已被修改,只是将变量名称更改为更通用的名称,并删除了不涉及页面的业务逻辑。

我几乎一切正常,除了当我尝试向我的数据添加新行时table,它会将整个 table 插入到我正在编辑的行中.仅取消编辑时也会发生这种情况。

考虑到我只是将一个项目插入到 List 对象中,而 Primefaces 又将其送入 table,这非常令人困惑。

这是我的 xhtml 的内容:

<h:form id="form">
<p:growl id="msgs" showDetail="true"/>

<p:dataTable var="object" value="#{page.objectList}" id="tableName"
     scrollable="false"
     liveResize="true"
     resizableColumns="true"
     editable="true"
     sortMode="multiple"
     reflow="true"
     paginator="true"
     rows="20"
     paginatorTemplate="{CurrentPageReport} {PreviousPageLink} {PageLinks} {NextPageLink} {RowsPerPageDropdown}"
     rowsPerPageTemplate="10,20,50,100">
  <f:facet name="header">
      Table Title
  </f:facet>

  <p:ajax event="rowEdit" listener="#{page.onRowEdit}" update=":form:msgs" />
  <p:ajax event="rowEditCancel" listener="#{page.onRowCancel}" update=":form:msgs" />

  <p:column headerText="col1">
    <p:cellEditor>
        <f:facet name="output"><h:outputText id="col1Output" value="#{object.col1item}" /></f:facet>
        <f:facet name="input">
            <p:inputText id="col1Input" value="#{object.col1item}" style="width:100%" />
        </f:facet>
    </p:cellEditor>
  </p:column>

  <p:column headerText="col2">
      <p:cellEditor>
          <f:facet name="output"><h:outputText value="#{object.col2item}" /></f:facet>
          <f:facet name="input">
              <h:selectOneMenu value="#{object.col2item}" style="width:100%">
                  <f:selectItems value="#{object.categories}" var="col2item" itemLabel="#{col2item}" itemValue="#{col2item}" />
              </h:selectOneMenu>
          </f:facet>
      </p:cellEditor>
  </p:column>

  <p:column headerText="col3">
    <p:cellEditor>
        <f:facet name="output"><h:outputText id="col3Output" value="#{object.col3item}" /></f:facet>
        <f:facet name="input">
            <p:inputText id="col3Input" value="#{object.col3item}" style="width:100%" />
        </f:facet>
    </p:cellEditor>
  </p:column>

  <p:column headerText="col4">
    <p:cellEditor>
        <f:facet name="output"><h:outputText id="col4Output" value="$#{object.col4item}" /></f:facet>
        <f:facet name="input">
            <p:inputText id="col4Input" converterId="com.gvea.utilities.business.Money" value="#{object.col4item}" style="width:100%" />
        </f:facet>
    </p:cellEditor>
  </p:column>

  <p:column headerText="col5">
    <p:cellEditor>
        <f:facet name="output"><h:outputText id="col5Output" value="#{object.col5item}" /></f:facet>
        <f:facet name="input">
            <p:inputText id="col5Input" value="#{object.col5item}" style="width:100%" />
        </f:facet>
    </p:cellEditor>
  </p:column>

  <p:column style="width:32px">
      <p:rowEditor/>
  </p:column>

</p:dataTable>
</h:form>

以及 onRowEdit 和 onRowCancel:

public void onRowEdit(RowEditEvent event) {
    /*-- modify object --*/
    ...
    objectList.add(0, newObject);
    /*-- Give success or failure message --*/
}

public void onRowCancel(RowEditEvent event) {
    FacesMessage msg = new FacesMessage("Edit Cancelled", "");
    FacesContext.getCurrentInstance().addMessage(null, msg);
}

objectList.add(...) 是我做任何可能有机会访问该页面的唯一地方...而且我已经验证 "newObject" 实际上是一个实例右边class。然而我还是得到了这个:

感谢您的帮助!

事实证明,我没有在以下行更新数据表:

<p:ajax event="rowEdit" listener="#{page.onRowEdit}" update=":form:msgs" />
<p:ajax event="rowEditCancel" listener="#{page.onRowCancel}" update=":form:msgs" />

只需将 form 添加到更新行即可解决我的问题。像这样:

<p:ajax event="rowEdit" listener="#{page.onRowEdit}" update=":form:msgs form" />
<p:ajax event="rowEditCancel" listener="#{page.onRowCancel}" update=":form:msgs form" />