2015-03-27 4 views
2

Я пытаюсь использовать Datascroller с LazyDataModel, и метод загрузки из ленивой модели данных вызывается дважды.Наверху lazy datascroller вызывает нагрузку дважды

Appart из соображений, что не так хорошо вызвать метод загрузки несколько раз (что может привести к дорогостоящим серверным/DB-переходам), так как моя ленивая модель данных не идемпотентна (что означает два последовательных вызова модели на одном и том же размер окна/страницы возвращает разные результаты) тот факт, что он называется дважды, означает: представленные результаты неверны.

Нормально ли для метода нагрузки в datascroller вызываться дважды? Если да, то какие-то обходные пути предложили мою альтернативу работать правильно? (Аппарт от изменения от statefull к безгосударственному модели данных)

Использования Primefaces 5.1, JSF2, Glassfish 4.1

+0

Я не эксперт, но я не в состоянии понять, что statefull против без гражданства должен делать с этим (и даже думаю, что это наоборот). Во-вторых, КОГДА он называется несколько раз. Перемещение мыши внизу? Затем проверьте выпуски PF, исправление для очень связанной проблемы было введено в выпусках Elite. – Kukeltje

+0

Ошибка происходит прямо на загрузке страницы, то есть на этапах визуализации компонентов. Когда я отлаживаю исходный код PF (DataScrollerRenderer), я увидел, что метод '' loadChunk'' эффективно вызывается дважды при работе с ленивым. Попытка и предоставление измененной версии DataScrollerRenderer – nuno

+0

И btw, statefull, в моем случае означает, что многократная загрузка вызова небезопасна - данные, возвращенные при первом вызове, отличаются от второго вызова. Если он вернет те же данные, проблем не будет: appart от выполнения избыточных вызовов db – nuno

ответ

3

Нет, это не нормально. Это действительно ошибка в PrimeFaces. Мы также обнаружили его некоторое время назад, когда использовали его на zeef.com. Мы обошли его, создав пользовательский визуализатор простирающегося DataScrollerRenderer и переопределение только encodeMarkup() метода с оригинальной реализацией copypasted, а затем только следующий фрагмент outcommented:

// BUGFIX: outcommented as this is already done in loadChunk() later on. 
/*if(ds.isLazy()) { 
    loadLazyData(ds, 0, chunkSize); 
}*/ 

Вы можете получить его запустить, зарегистрировав его, как показано ниже в WebApp-х faces-config.xml:

<render-kit>  
    <renderer> 
     <component-family>org.primefaces.component</component-family> 
     <renderer-type>org.primefaces.component.DataScrollerRenderer</renderer-type> 
     <renderer-class>com.example.YourDataScrollerRenderer</renderer-class> 
    </renderer> 
</render-kit> 
+0

Фрагмент заголовка неправильно отображается, если первая загрузка (комментарий) не запускается. Ниже приведена альтернативная реализация. – nuno

+0

Правильно, мы не используем грань заголовка. Ваша реализация выглядит разумной. – BalusC

1

с фаской заголовка, в BalusC посте, не отображается правильно, если первая нагрузка (комментарий секции) не работает, требуется несколько иная реализация

public class DataScrollerRenderer2 extends DataScrollerRenderer { 

    @Override 
    protected void encodeMarkup(FacesContext context, DataScroller ds, int chunkSize) throws IOException { 
     // ... 
     boolean alreadyLoaded = false; 
     if (ds.isLazy()) {    
      alreadyLoaded = true; 
      loadLazyData(ds, 0, chunkSize); 
     } 
     // ... 
     loadChunk(context, ds, 0, chunkSize, alreadyLoaded); 
     // ... 
    } 

    @Override 
    protected void loadChunk(FacesContext context, DataScroller ds, int start, int size) throws IOException { 
     loadChunk(context, ds, start, size, false); 
    } 

    private void loadChunk(FacesContext context, DataScroller ds, int start, int size, boolean alreadyLoaded) throws IOException { 
     // ... 
     if (ds.isLazy() && !alreadyLoaded) { 
      loadLazyData(ds, start, size); 
     } 
     // ... 
    } 

} 

Не уверен, что это лучшая реализация, но это сработало.

EDIT: проблема была подана в PrimeFaces GitHub

+0

не исправлено в PF 5.3 правильно? – internet

+0

Просто попробовал PF 5.3 и, по-видимому, исправлена. По крайней мере мой метод загрузки вызывается только один раз. – sinclair

+0

@ Синклер: Не могли бы вы поделиться своим кодом. Бин и JSF. Большое спасибо – internet

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