Lazy Loading JSF primefaces não carrega p:dataTable

Bom dia Pessoal,

Dei uma pesquisada no fórum e não encontrei uma solução para o meu problema fiz varios testes aqui e nada, então gostaria de saber se alguem pode me ajudar

O problema é que não consigo carregar os dados para minha tabela, estou usando EJB, CDI, PrimeFaces 3.2, JPA, já fiz assim:

Meu xhtml:

<p:dataTable id="dtNumberType"
				value="#{telNumberTypeBean.lazyModel}" var="numberType"
				widgetVar="telNumberType" 
				paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}"
				emptyMessage="Not empty telNumberTypeBean.telNumberTypes"
				paginator="true" rows="5" rowKey="#{numberType.id}" lazy="true">

Meu Bean:
Criei um get para carregar os dados, mas não funcionou

public LazyDataModel<TelNumberType> getLazyModel() {
		if(lazyModel == null){
			lazyModel = new LazyDataModel<TelNumberType>() {
				@Override
				public List<TelNumberType> load(int first, int pageSize,
						String arg2, SortOrder arg3, Map<String, String> arg4) {
					System.out.println("Teste: " + first + "teste2: "
							+ pageSize);
					List<TelNumberType> list = service.retrieveAllDataLazy(
							pageSize, first);
					return list;
				}
			};
		}
		return lazyModel;
	}

Também tentei carregar os dados pelo @PostConstruct, sem sucesso

@PostConstruct
	public String update() {
		
		lazyModel = new LazyDataModel<TelNumberType>() {
			@Override
			public List<TelNumberType> load(int first, int pageSize, String arg2,
					SortOrder arg3, Map<String, String> arg4) {
				System.out.println("Teste: " + first + "teste2: " + pageSize);
				List<TelNumberType> list = service.retrieveAllDataLazy(pageSize, first);
				return list;
			}
		};

Gostaria de saber se alguem teve o mesmo problema e como foi resolvido;

E qual o problema que você está tendo?

Você chegou a implementar o seu próprio LazyDataModel como é feito no showcase?

Já sim, tanto que eu fiz um exemplo igual o deles, utilizando uma lista de String e funcionou.

Mas na pratica o meu não funciona, mesmo criando outra classe intermediaria.

O que não entendo é que ele carrega o getLazyModel com a lista certinho, mas não mostra na tela.

Já fiz tanto teste que já não sei mais o que fazer

Tente fazer conforme esse link: Lazy JSF Datatable Pagination (Primefaces).

Bom dia Pessoal,

Então eu mudei o meu metodo no Bean e funcionou, bom, mais ou menos, ele está preechendo a tabela e paginando, mas quando eu seleciono um item para poder alterar ele está dando erro.

Meu metodo ficou assim:

public LazyDataModel<TelNumberType> getLazyModel() {
		if(lazyModel == null){
			lazyModel = new LazyDataModel<TelNumberType>() {
				@Override
				public List<TelNumberType> load(int first, int pageSize,
						String arg2, SortOrder arg3, Map<String, String> arg4) {
					try {
						list = new ArrayList<TelNumberType>();
						list = service.retrieveAllDataLazy(pageSize, first);
					} catch (Exception e) {
						e.printStackTrace();
					}
					
					if(getRowCount() <= 0){
			            setRowCount(service.countData());
			        }
			 
			        setPageSize(pageSize);
					return list;
				}
			};
		}
		return lazyModel;
	}

O erro que está dando agora é esse:

AVISO [javax.enterprise.resource.webcontainer.jsf.lifecycle] (http-localhost-127.0.0.1-8080-1) / by zero: java.lang.ArithmeticException: / by zero
at org.primefaces.model.LazyDataModel.setRowIndex(LazyDataModel.java:62) [primefaces-3.2.jar:]
at javax.faces.component.UIData.setRowIndexWithoutRowStatePreserved(UIData.java:485) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
at javax.faces.component.UIData.setRowIndex(UIData.java:473) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
at javax.faces.component.UIData.iterate(UIData.java:1978) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
at javax.faces.component.UIData.processDecodes(UIData.java:1161) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
at org.primefaces.component.datatable.DataTable.processDecodes(DataTable.java:571) [primefaces-3.2.jar:]
at javax.faces.component.UIForm.processDecodes(UIForm.java:225) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
at javax.faces.component.UIComponentBase.processDecodes(UIComponentBase.java:1176) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
at javax.faces.component.UIComponentBase.processDecodes(UIComponentBase.java:1176) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
at javax.faces.component.UIViewRoot.processDecodes(UIViewRoot.java:933) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
at com.sun.faces.lifecycle.ApplyRequestValuesPhase.execute(ApplyRequestValuesPhase.java:78) [jsf-impl-2.1.7-jbossorg-2.jar:]
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) [jsf-impl-2.1.7-jbossorg-2.jar:]
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) [jsf-impl-2.1.7-jbossorg-2.jar:]
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.13.Final.jar:]
at org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:62) [weld-core-1.1.5.AS71.Final.jar:2012-02-10 15:31]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.13.Final.jar:]
at br.com.cpqd.intervoip.web.filter.TelNumberFilter.doFilter(TelNumberFilter.java:31) [classes:]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.13.Final.jar:]
at br.com.cpqd.intervoip.web.filter.AuthenticatorFilter.doFilter(AuthenticatorFilter.java:31) [classes:]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [jbossweb-7.0.13.Final.jar:]
at org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:50) [jboss-as-jpa-7.1.1.Final.jar:7.1.1.Final]
at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:153) [jboss-as-web-7.1.1.Final.jar:7.1.1.Final]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368) [jbossweb-7.0.13.Final.jar:]
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [jbossweb-7.0.13.Final.jar:]
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:671) [jbossweb-7.0.13.Final.jar:]
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930) [jbossweb-7.0.13.Final.jar:]
at java.lang.Thread.run(Unknown Source) [rt.jar:1.6.0_31]

Já estou pesquisando desde ontem e ainda não encotrei uma solução, se alguem tiver alguma ideia é só falar…

Obrigado

Qual o escopo do seu bean? Esse erro já aconteceu cmg quando usei RequestScope ou um desses caras está = 0

setRowCount(service.countData());[/code] ou [code]setPageSize(pageSize);  

Não me lembro exatamente qual.

Então… como estou usando CDI estou usando o @RequestScoped

[quote=sheyster]Então… como estou usando CDI estou usando o @RequestScoped[/quote]CDI tem Session e Conversation além do request.

Com request não consegui e acho que ñ funfa. ^^

Ai complica, pois como vai ter muito acesso e muitos dados não posso estar usando session

[quote=sheyster]Ai complica, pois como vai ter muito acesso e muitos dados não posso estar usando session[/quote]Conversation ou não CDI com ViewScoped ou não usa o primefaces. [=

Pois é… mas a arquitetura já está pronta, não posso altera-lá

Mas vlw… Obrigadão pela ajuda, vou tentar fazer alguns testes aqui, se der certo eu posto aqui.

Deu certo… Coloquei um valor para o setPageSize fora do lazyModel e funcionou.

Obrigado pessoal

Olá sheyster. Você tem como postar a sua solução ? Estou tentando implementar o exemplo do showcase da página do primefaces, mas não estou conseguindo.

Obrigado.

Bom dia, cristianoassis

Posso sim, mas seria mais facil saber qual a sua dificuldade, mas vamos lá.

o meu xhtml ficou assim:

<p:dataTable 
				id="dtNumberType" 
				value="#{telNumberTypeBean.lazyModelTn}"
				var="numberType" 
				widgetVar="telNumberType" 
				lazy="true"
				paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}"
				currentPageReportTemplate = "{currentPage} #{msg['app.paginator.label.de']} {totalPages}"
				emptyMessage="#{msg['cadastro.telnumber.mensagem.semRegistros']}"
				paginator="true" 
				rows="15" 
				paginatorPosition="bottom"
				rowKey="#{numberType.id}">

e o meu bean assim:

if (lazyModelTn == null) { 
			lazyModel = new LazyDataModel<TelNumberType>() {
				@Override
				public List<TelNumberType> load(int first, int pageSize,
						String arg2, SortOrder arg3, Map<String, String> arg4) {
					MascaraTelefone mascaraTelefone = new MascaraTelefone();
					try {
						List<TelNumberType> mains = new ArrayList<TelNumberType>();
                                                // Aqui eu verifico se o usuário digitou algo no campo de pesquisa
						if (number != 0) {
							mains = service.searchAllDataLazyByNum(pageSize,
									first, "number", "number", number, sessionBean.getUser().getOrganization(), "FK_ORGANIZATION_ID");
						} else {
							mains = service.retrieveAllDataLazy(pageSize,
									first, "number", "FK_ORGANIZATION_ID", sessionBean.getUser().getOrganization());
						}
                                                // Esse codigo é para fazer uma conversão
						for (TelNumberType numberType : mains) {
							if (numberType.getCorClaim() == TrueFalse.S
									.getType().charAt(0)) {
								numberType.setTypeCorClaim(true);
							} else {
								numberType.setTypeCorClaim(false);
							}
							
							numberType.setAux(mascaraTelefone.getMaskString(numberType.getNumber()));

							list.add(numberType);
						}
					} catch (Exception e) {
						e.printStackTrace();
					}

					if (getRowCount() <= 0) {
						setRowCount(service.countData()); // Aqui foi feita uma busca no banco para sabe a quantidade de registros
					}

					setPageSize(pageSize);
					return list;
				}
			};
			lazyModel.setPageSize(1);
		}

Qualquer duvida posta ai.

Abrs.

Olá sheyster,

Meu problema esta no filtro. A lista é carregada sem problema, mas quando filtro ela fica em branco.

Controller


    public LazyDataModel<CatServico> getLazyCatServico() {
        if (idUsrValido == null) { 
            idUsrValido = userLogado.getLoggedUser().getId();            
            list = bean.getAll(userLogado.getLoggedUser().getEmpresa().getId());
            lazyCatServico = new LazyCatServico(list);              
        } else if (idUsrValido != userLogado.getLoggedUser().getId()) {
            userLogado.doLogOut();
        }        
        else if (list == null) {
            list = bean.getAll(userLogado.getLoggedUser().getEmpresa().getId());
            idUsrValido = userLogado.getLoggedUser().getId();   
            lazyCatServico = new LazyCatServico(list);                          
        }
        return lazyCatServico;
    }

Model

import br.com.entidades.servicos.CatServico;
import java.util.ArrayList;  
import java.util.Iterator;  
import java.util.List;  
import java.util.Map;  
import org.primefaces.model.LazyDataModel;  
import org.primefaces.model.SortOrder;

public class LazyCatServico extends LazyDataModel<CatServico> {

    private List<CatServico> datasource;  
      
    public LazyCatServico(List<CatServico> datasource) {  
        this.datasource = datasource;  
    }  
      
    @Override  
    public CatServico getRowData(String rowKey) {  
        for(CatServico catServico : datasource) {  
            if(catServico.getCodigo().equals(rowKey))  
                return catServico;  
        }    
        return null;  
    }  
  
    @Override  
    public Object getRowKey(CatServico catServico) {  
        return catServico.getCodigo();  
    }  
  
    @Override      
    public List<CatServico> load(int first, int pageSize, String sortField,  SortOrder sortOrder, Map<String,String> filters) {  
        List<CatServico> data = new ArrayList<CatServico>();  
  
        //filter  
        for(CatServico catServico : datasource) {  
            boolean match = true;  
  
            for(Iterator<String> it = filters.keySet().iterator(); it.hasNext();) {  
                try {  
                    String filterProperty = it.next();  
                    String filterValue = filters.get(filterProperty);  
                    String fieldValue = String.valueOf(catServico.getClass().getField(filterProperty).get(catServico));  
  
                    if(filterValue == null || fieldValue.startsWith(filterValue)) {  
                        match = true;  
                    }  
                    else {  
                        match = false;  
                        break;  
                    }  
                } catch(Exception e) {  
                    match = false;  
                }   
            }    
            if(match) {  
                data.add(catServico);  
            }  
        }  
  
        //rowCount  
        int dataSize = data.size();  
        this.setRowCount(dataSize);  
  
        //paginate  
        if(dataSize > pageSize) {  
            try {  
                return data.subList(first, first + pageSize);  
            }  
            catch(IndexOutOfBoundsException e) {  
                return data.subList(first, first + (dataSize % pageSize));  
            }  
        }  
        else {  
            return data;  
        }  
    }  
} 

View

                                <p:dataTable id="tbl" var="item" value="#{catServicoFace.lazyCatServico}" 
                                         selection="#{catServicoFace.selectedLinha}" selectionMode="single"
                                         paginator="true" rows="10"  lazy="true" 
                                         paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks}
                                         {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
                                         currentPageReportTemplate="[ Exibindo de {startRecord} a {endRecord} no total de {totalRecords}  
                                         - Página: {currentPage}/{totalPages} ]"                                                                            
                                         emptyMessage="Não há registros a exibir"
                                         rowStyleClass="#{empty rowIx or rowIx mod 2 ne 0 ? 'even-row' : 'odd-row'}" 
                                         rowIndexVar="rowIx" 
                                         style="font-size: 10px; background-color: lightblue">

                                    <f:facet name="header">     
                                        Categorias de serviços 
                                    </f:facet>                             
                                    <p:column sortBy="#{item.codigo}" filterBy="#{item.codigo}">  
                                        <f:facet name="header">
                                            <h:outputText value="Código"/>
                                        </f:facet>
                                        <h:outputText value="#{item.codigo}"/>
                                    </p:column>                              

Obrigado

Cristiano, bom dia

Você está utilizando o filtro padrão do Primefaces?

filterBy=""

Eu não estou utilizando esse filtro, eu criei o meu campo filtro e quando o usuario aperta enter ou clica no botão ele irá passa no meu bean no @PostConstruct, fazer a busca novamente com esse parâmetro e paginar casa haja mais de 10 registros:
xhtml

<f:facet name="header">
					<p:outputPanel id="oppGD">
						<h:outputText value="#{msg['cadastro.grupodestino.label.buscar']}: " id="optGD" />
						<p:inputText id="globalFilter" value="#{destGroupBean.name}"
							style="width:150px" />
						<p:commandButton id="cbSearchGD" value="#{msg['cadastro.botao.buscar']}" ajax="false"
							update="@form, :formDest" event="rowSelect" icon="ui-icon-search"/>
					</p:outputPanel>
				</f:facet>

bean

// Aqui eu verifico se o usuário digitou algo no campo de pesquisa e faço a consulta passando o parâmetro caso não eu busco todos os dados
if (number != 0) {  
      mains = service.searchAllDataLazyByNum(pageSize,  
             first, "number", "number", number, sessionBean.getUser().getOrganization(), "FK_ORGANIZATION_ID");  
} else {  
      mains = service.retrieveAllDataLazy(pageSize,  
             first, "number", "FK_ORGANIZATION_ID", sessionBean.getUser().getOrganization());  
}  

Agora deixa eu tentar entender, você está passando uma lista para essa classe e tentando filtrar essa lista e pagina-lá?

Se for isso não vai ficar performático, acho que você deveria passar essa responsabilidade para o Lazy paginar pois ele buscaria somente os dados necessário ao inves de buscar tudo.

Esse código que postei faz isso, eu tenho 1.000,000 de registros no banco e busco somente 10 essa mesma busca é utilizada no filtro, por esse motivo passo esses parâmentros para minha consulta.

Espero ter ajudado, caso tenha mais duvidas é só postar.

Abraços.

Olá sheyster, realmente estou tentando utilizar o filtro do primefaces, mas sem sucesso. Vou tentar seguir a sua dica e qualquer dúvida eu grito. Muito obrigado.