Помогите разобраться с многочисленными вызовами JSF к управляемому компоненту

Я использую h: datatable, вот соответствующая строка моего кода:

 <h:dataTable value="#{account.latestIncomes}" var="mov" >
 .....
 </h:dataTable>

затем у меня есть управляемый компонент с областью запроса с геттером для последних доходов:

 public List<Movs> getlatestIncomes() {
    if (incomes == null)
    incomes = this.cajaFacade.getLatestIncomes(20);
    return incomes;
}

этот геттер вызывается 8 раз, и я больше нигде его не использую, только для значения для dataTable. Почему это происходит? Если вам нужно больше кода, пожалуйста, спросите. Но это единственное место, где я использую это свойство.


person arg20    schedule 28.03.2011    source источник
comment
взгляните на stackoverflow.com/questions/ 2090033/   -  person Mark    schedule 28.03.2011
comment
Да, это 3 или 4 раза, но нормально ли, что геттер вызывается от 8 до 10 раз?   -  person arg20    schedule 28.03.2011
comment
Как упоминал BalusC в этом вопросе, вы не должны выполнять бизнес-логику в своем методе получения, как вы делаете в своем коде. Не могли бы вы переместить этот код в методы init() или contructor()? Таким образом, когда вы получаете вызов, он просто возвращает предварительно загруженный список?   -  person CoolBeans    schedule 28.03.2011


Ответы (1)


Он вызывается столько раз, сколько JSF нужно для доступа к нему. Технически вы не должны беспокоиться об этом.

Однако с данным фрагментом кода он должен вызываться не более 3 раз, и все это на этапе ответа на рендеринг. Один раз во время encodeBegin(), один раз в течение encodeChildren() и один раз во время encodeEnd(). Или он содержит элементы ввода, и вы считали их во время отправки формы?

Несмотря на это, отладка стека и текущего идентификатора фазы в геттере должна дать некоторое представление.

private List<Movs> latestIncomes;
private AtomicInteger counter = new AtomicInteger();

@PostConstruct
public void init() {
    latestIncomes = cajaFacade.getLatestIncomes(20);
}

public List<Movs> getlatestIncomes() {
    System.err.printf("Get call #%d during phase %s%n", counter.incrementAndGet(), 
        FacesContext.getCurrentInstance().getCurrentPhaseId());
    Thread.dumpStack();

    return latestIncomes;
}

(как видите, я переместил загрузку списка в нужное место)

person BalusC    schedule 28.03.2011