解决方案是在包含其他表的表中添加 rowStatePreserved="true"。这是在 Primefaces 5.1.14 中添加的,是 JSF 2.1 的一部分。
鸣谢:sdjavaudvk (http://forum.primefaces.org/viewtopic.php?f=3&t=43441)。
<p:dataTable id="tab1" var="resumo" value="#{resumoView.resumos}" rows="20"
paginator="true"
rowsPerPageTemplate="5,10,15,20"
rowStatePreserved="true">
...
您是否尝试过为每个数据表使用不同的表单?像这样:
<h:form>
<p:dataTable id="tab1"> ... </p:dataTable>
</h:form>
<h:form>
<p:dataTable id="tab2"> ... </p:dataTable>
</h:form>
我们在Primefaces6.0上遇到了同样的问题。
我们有一个包含两个表的表单,并且可以通过值列表(filterMatchMode 精确)或通过输入文本(filterMatchMode 包含)过滤特定列。
第一个表没有工作过滤器(我们遇到了与您相同的 NullPointerException),第二个表工作正常。
这两个表在一个组件中,两个表中过滤和排序的列是使用 JSTL 有条件构建的,如下所示:
<c:choose>
<c:when test="#{cc.attrs.filterOperatorExact}">
<p:column headerText="Header name"
sortBy="#{vector.operatorForDisplay}"
filterBy="#{vector.operatorForDisplay}" filterMatchMode="exact"
filterOptions="#{cc.attrs.filtersOperatorList}">
<h:outputText value="#{vector.operatorForDisplay}" />
</p:column>
</c:when>
<c:otherwise>
<p:column headerText="Header name"
sortBy="#{vector.operatorForDisplay}"
filterBy="#{vector.operatorForDisplay}" filterMatchMode="contains">
<h:outputText value="#{vector.operatorForDisplay}" />
</p:column>
</c:otherwise>
</c:choose>
使用“JSF方式”对渲染的属性执行此操作,问题消失了:
<p:column headerText="Header name"
sortBy="#{vector.operatorForDisplay}"
filterBy="#{vector.operatorForDisplay}" filterMatchMode="exact"
filterOptions="#{cc.attrs.filtersOperatorList}"
rendered="#{cc.attrs.filterOperatorExact}">
<h:outputText value="#{vector.operatorForDisplay}"/>
</p:column>
<p:column headerText="Header name"
sortBy="#{vector.operatorForDisplay}"
filterBy="#{vector.operatorForDisplay}" filterMatchMode="contains"
rendered="#{not cc.attrs.filterOperatorExact}">
<h:outputText value="#{vector.operatorForDisplay}"/>
</p:column>
希望有帮助。