我在 SO 上(不仅)阅读了关于这个主题的所有答案,但这些都不能解决我的问题。我有数据表:
<p:dataTable
value="#{reportBean.reportData.rows}"
var="row"
styleClass="listBlock dataTableOverflowAuto fullScreenTable"
rendered="#{!reportBean.reportData.grouped}">
<f:facet name="header">
#{msg['report.table.header']}
</f:facet>
<p:column>
#{row.integrationName}
</p:column>
<p:column>
#{row.integrationId}
</p:column>
<p:column>
#{row.service}
</p:column>
<p:columns value="#{reportBean.reportData.columns}"
var="column">
<f:facet name="header">
#{column}
</f:facet>
<h:outputText value="#{row.getData(column)}" escape="false" />
</p:columns>
reportBean 上的 getReportData() 非常简单(无需计算):
public ReportDataInterface getReportData() {
return reportData;
}
并且返回的数据是:
public class NoneGroupedReportData implements ReportDataInterface {
private int counter = 0;
Logger logger = LoggerFactory.getLogger(getClass());
private List<String> columns = new LinkedList<String>();
public void addRow(Row row) {
addColumns(row);
}
public List<String> getColumns() {
counter++;
logger.debug("getColumns called {} times", counter);
return columns;
}
....
结果是
2013-05-15 07:38:07,405 () DEBUG NoneGroupedReportData - getColumns 调用了 21600 次
对于具有约 30 行和 10 列的数据表。
我知道为什么JSF多次调用getter,但几乎是22k,为什么?当我需要更多结果(> 1000)时,它不会在 5 分钟内呈现,因为它会无休止地调用这个 getter。问题出在哪里,如何实现每行最多调用 5~10 次 getColumns() 的状态?
我曾尝试使用 jstl c:set "caching" 但没有任何结果(http://qussay.com/2013/04/19/caching-and-reusing-an-evaluated-el-expression-in-jsf/)
编辑:我的猜测是 getter 调用不是“错误的”,而是表明我以错误的方式使用 dataTable。