2013-05-15 2 views
1

Я прочитал все ответы на эту тему (не только) на SO, но ничто из этого не решает мою проблему. У меня есть DataTable:JSF + прайсы, вызывающие getter way too much times

<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> 

getReportData() на reportBean не очень просто (без расчета):

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 0 7: 38: 07405() ОТЛАДКА NoneGroupedReportData - getColumns называемые 21600 раз

Для Datatable с ~ 30 строк и 10 столбцов.

Я знаю, почему JSF вызывает геттеры много раз, но почти 22k, почему? Когда мне нужно больше результатов (> 1000), он не будет отображаться через 5 минут, потому что он бесконечно называет этот геттер. Где проблема и как я могу достичь состояния, в котором getColumns() вызывается для каждой строки max 5 ~ 10 раз?

Я попытался с помощью JSTL C: установить «кэширование», но без какого-либо результата (http://qussay.com/2013/04/19/caching-and-reusing-an-evaluated-el-expression-in-jsf/)

EDIT: Я думаю, что добытчик звонки не «неправильно», но признак того, что я использую DataTable в неправильном направлении ,

+3

Вы не дадите полную информацию здесь. Где находится экземпляр «NoneGroupedReportData»? – kolossus

+0

Это вид области. И экземпляр NoneGroupedReportData является свойством управляемого компонента. – DominikM

+0

Вы отсылаете reportData не менее 3 раз, и они могут быть ненужными. не требуется, чтобы выборки строк и столбцов были отдельно. – erencan

ответ

5

Проблема заключается в том, что вы обращаетесь в два раза ту же структуру данных,

N: <p:dataTable value="#{reportBean.reportData.rows}" ... 

, а затем ВНУТРИ тот же р: DataTable вы используете

M: <p:columns value="#{reportBean.reportData.columns}" ... 

Это вызывает N * M продукт, который в конце дает вам 21600 раз, потому что вы обращаетесь к с такой же структурой данных в два вложенные теги ...

Это не ясно, какой из DataTable вы пытаетесь построить, но я думаю, вы должны реорганизовать структуры данных.

Чем проще решение, в случае, если вы пытаетесь поставить несколько значений внутри одной колонки для каждой строки будет меняющимся М к:

M: <p:columns value="#{rows.columns}" ... 

Но что будет включать в себя изменение вашей структуры данных, чтобы положить ваш столбцы компонент в ваш строк компонента.

С уважением,

Смежные вопросы