2014-09-01 52 views
0

我有一个数据表在我的xhtml视图中启用过滤。此外,上下文菜单中还有Primefaces导出(用于Excel)功能。当我使用这个函数而不过滤数据表时,它工作正常,但是当我首先过滤数据并导出数据时,我得到一个空行的文件。Dataexporter过滤后返回空行

这是我的代码:

<p:panel header="#{msg['prs.list']}"> 
    <p:contextMenu for="persons"> 
     <p:menuitem value="#{msg['com.view']}" icon="#{msg['icon.view']}" 
        action="#{personBean.redirectToEditPerson}"/> 
     <p:menuitem value="#{msg['student.new']}" icon="#{msg['icon.new']}" 
        action="#{personBean.redirectToNewStudent}"/> 
     <p:menuitem value="#{msg['prs.new']}" icon="#{msg['icon.new']}" 
        url="edit.xhtml"/> 
     <p:menuitem value="#{msg['report.export.excel']}" ajax="false" icon="#{msg['icon.export']}"> 
      <p:dataExporter type="xls" target="persons" fileName="export" /> 
     </p:menuitem> 
    </p:contextMenu> 
    <p:dataTable id="persons" var="person" value="#{personBean.personList}" 
       rowKey="#{person.id}" selection="#{personBean.selectedPerson}" selectionMode="single" 
       emptyMessage="#{msg['com.noEntries']}" paginator="true" rows="15"> 

     <p:column headerText="Id"> 
      <h:outputText value="#{person.id}"/> 
     </p:column> 

     <p:column headerText="#{msg['prs.name']}" filterBy="name" filterMatchMode="contains"> 
      <h:outputText value="#{person.name}"/> 
     </p:column> 

     <p:column headerText="#{msg['prs.surname']}" filterBy="surname" filterMatchMode="contains"> 
      <h:outputText value="#{person.surname}"/> 
     </p:column> 

     <p:column headerText="#{msg['prs.email']}" filterBy="email" filterMatchMode="contains"> 
      <h:outputText value="#{person.email}"/> 
     </p:column> 

    </p:dataTable> 
    <f:facet name="footer"> 
     <p:button value="#{msg['prs.new']}" icon="#{msg['icon.new']}" 
        outcome="edit"/> 
    </f:facet> 
</p:panel> 

我使用Primefaces 4,JSF 2和Java 7 Wildfly 8

回答

1

解决。我在日志中发现了有关数据表的filteredValue属性的警告。

[0m[33m17:26:45,701 WARNING [org.primefaces.component.datatable.DataTable] (default task-4) DataTable form:persons has filtering enabled but no filteredValue model reference is defined, for backward compatibility falling back to page viewstate method to keep filteredValue. It is highly suggested to use filtering with a filteredValue model reference as viewstate method is deprecated and will be removed in future. 

因此,我加入这个属性,然后解决了这个问题

<p:dataTable id="persons" var="person" value="#{personBean.personList}" 
    rowKey="#{person.id}" selection="#{personBean.selectedPerson}" 
    selectionMode="single" emptyMessage="#{msg['com.noEntries']}" 
    paginator="true" rows="15" filteredValue="#{personBean.filtered}"> 

而且在PersonBean增加了以下特性以及

private List<PersonEntity> filtered; 
public List<PersonEntity> getFiltered() { return filtered; } 
public void setFiltered(List<PersonEntity> filtered) { this.filtered = filtered; }