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 列の dataTable の場合。
JSF がゲッターを何度も呼び出す理由はわかっていますが、ほぼ 22k の理由は何ですか? より多くの結果 (>1000) が必要な場合、このゲッターを際限なく呼び出すため、5 分でレンダリングされません。問題はどこにあり、行ごとに getColumns() が最大 5 ~ 10 回呼び出される状態をどのように達成できますか?
jstl c:set "caching" を使用してみましたが、結果はありません ( http://qussay.com/2013/04/19/caching-and-reusing-an-evaluated-el-expression-in-jsf/ )
編集:ゲッターの呼び出しは「間違っている」のではなく、 dataTable を間違った方法で使用していることを示していると思います。