[Resolvido] DataTable Primefaces com Lazy

Boa Tarde Pessoal.

Fiz uma dataTable paginada usando primefaces mas estou com um problema.

Está trazendo os dados na tabela, mas quando clico para filtrar ou próxima página etc, nada acontece.

Se alguem puder me ajudar, seguem os códigos:

Bean:

@Controller
@ManagedBean(name="listaEntregaMB")
@ViewScoped
public class ListaEntregaMB implements Serializable {

	private static final long serialVersionUID = 1L;
	private LazyDataModel<Entrega> entregas;
	private Entrega selectedBean;
	
	@Autowired
	private EntregaService entregaService;

	
	public LazyDataModel<Entrega> getEntregas(){
		if(entregas == null){
			entregas = new LazyEntregaDataModel(entregaService);
		}
		return entregas;
	}
	
	public void setEntregas(LazyDataModel<Entrega> entregas) {
		this.entregas = entregas;
	}

	public Entrega getSelectedBean() {
		return selectedBean;
	}

	public void setSelectedBean(Entrega selectedBean) {
		this.selectedBean = selectedBean;
	}
}

xhtml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"   
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:p="http://primefaces.org/ui"
      xmlns:f="http://java.sun.com/jsf/core"
      >
    <h:body>
 
    	<ui:composition template="/template/commonLayout.xhtml">
 
    		<ui:define name="content">
			<p:dataTable id="dataTable" var="item"
				value="#{listaEntregaMB.entregas}" paginator="true"
				rows="5"
				paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}"
	        	rowsPerPageTemplate="5, 10, 15"
	        	selectionMode="single"
	        	lazy="true"
	        	selection="#{entregaMB.selectedBean}"
	        	paginatorPosition="bottom">
				<f:facet name="header">  
            Lista de Entregas Realizadas 
        </f:facet>

				<p:column sortBy="#{item.projeto}" filterBy="#{item.projeto}">
					<f:facet name="header">
						<h:outputText value="Projeto" />
					</f:facet>
					<h:outputText value="#{entrega.projeto}" />
				</p:column>

				<p:column sortBy="#{item.revisao}" filterBy="#{item.revisao}">
					<f:facet name="header">
						<h:outputText value="Revisão" />
					</f:facet>
					<h:outputText value="#{item.revisao}" />
				</p:column>

				<p:column>
					<f:facet name="header">
						<h:outputText value="Usuário" />
					</f:facet>
					<h:outputText value="#{item.autor}" />
				</p:column>

				<p:column>
					<f:facet name="header">
						<h:outputText value="Data Entrega" />
					</f:facet>
					<h:outputText value="#{item.dataEntrega}" />
				</p:column>
			</p:dataTable>
		</ui:define>
 
    	</ui:composition>
 
    </h:body>
 
</html>

LazyDataModel:

public class LazyEntregaDataModel extends LazyDataModel<Entrega> {  
      
	private static final long serialVersionUID = 1L;
	
	private EntregaService entregaService;
	
	private List<Entrega> entregas;  
      
    public LazyEntregaDataModel(EntregaService entregaService) {  
        this.entregaService = entregaService;
    }  
      
    @Override  
    public Entrega getRowData(String rowKey) {  
    	Integer id = Integer.valueOf(rowKey);
        for(Entrega entrega : entregas) {  
            if(id.equals(entrega.getId()));  
                return entrega;  
        }  
  
        return null;  
    }  
  
    @Override  
    public Object getRowKey(Entrega entrega) {  
        return entrega.getId();
    }

    @SuppressWarnings("unchecked")
	@Override
	public List<Entrega> load(int primeiro, int registrosPagina, String camposort, 
			SortOrder campoordenar,
			Map<String, String> filtros) {
    	setRowCount(entregaService.retornaTotalRegistrosConsulta(
						primeiro, registrosPagina, camposort, campoordenar,
						filtros, Entrega.class));
		return entregaService.listarPaginado(primeiro, registrosPagina,
				camposort, campoordenar, filtros, Entrega.class);
	}
} 

LazyDataModel é uma classe do primefaces ?

No richfaces tinha que implementar outra interface para permitir filtrar e ordenar eu acho.

Deu uma olhada no showcase ?
Lá tem implementações de lazy data model

Pessoal,

Resolvi o problema.

Verifiquei que no meu template não tinha colocado o <h:form>

Obrigado

Cara, poderia postar os metodos retornaTotalRegistrosConsulta e listarPaginado?

Segue os métodos do DAO:


	@SuppressWarnings("unchecked")
	public <T> List<T> listarPaginado(int primeiro, int registrosPagina,
			String camposort, SortOrder campoordenar,
			Map<String, String> filtros, Map<String, Object> filtrosEspecificos, Class<T> clazz) {
		
		DetachedCriteria criteria = retornaCriteriaBaseFiltros(filtros, filtrosEspecificos, clazz);

		if (camposort != null) {
			switch (campoordenar) {
			case ASCENDING:
				criteria.addOrder(Order.asc(camposort));
				break;
			case DESCENDING:
				criteria.addOrder(Order.desc(camposort));
				break;
			}
		}

		criteria.getExecutableCriteria(getSession()).setFirstResult(primeiro);
		criteria.getExecutableCriteria(getSession()).setMaxResults(
				registrosPagina);

		return criteria.getExecutableCriteria(getSession()).list();
	}
	    
	    public <T> int retornaTotalRegistrosConsulta(int primeiro, int registrosPagina, 
				String camposort, 	SortOrder campoordenar,	Map<String, String> filtros, 
				Map<String, Object> filtrosEspecificos, Class<T> clazz){
	    	
	    	DetachedCriteria criteria = retornaCriteriaBaseFiltros(filtros, filtrosEspecificos, clazz);
	    	
	    	Long i = 0L;
	    	
			criteria.setProjection(Projections.rowCount());
			
			i = (Long) criteria.getExecutableCriteria(getSession()).uniqueResult();
			
	    	return i.intValue();
	    }
	    
	    private DetachedCriteria retornaCriteriaBaseFiltros(Map<String, String> filtros, Map<String, Object> filtrosEspecificos, Class clazz){
	    	DetachedCriteria criteria = DetachedCriteria.forClass(clazz);
	    	
			if(filtrosEspecificos != null){
				for (Iterator<String> it = filtrosEspecificos.keySet().iterator(); it.hasNext();) {
					String filterProperty = it.next();
					Object filterValue = filtrosEspecificos.get(filterProperty);
					criteria.add(Restrictions.eq(filterProperty, filterValue));
				}
			}

			for (Iterator<String> it = filtros.keySet().iterator(); it.hasNext();) {
				String filterProperty = it.next();
				String filterValue = filtros.get(filterProperty);
				criteria.add(Restrictions.eq(filterProperty, filterValue));
			}
	    	return criteria;
	    }

Segue meu Bean:

projetos = new LazyDataModel<Projeto>() {

			private static final long serialVersionUID = 1L;

			@SuppressWarnings("unchecked")
			@Override
			public List<Projeto> load(int primeiro, int registrosPagina,
					String camposort, SortOrder campoordenar,
					Map<String, String> filtros) {
				
				setRowCount(projetoService.retornaTotalRegistrosConsulta(
						primeiro, registrosPagina, camposort, campoordenar,
						filtros, null, Projeto.class));

				return projetoService.listarPaginado(primeiro, registrosPagina,
						camposort, campoordenar, filtros, null, Projeto.class);
			}

			@Override
			public Projeto getRowData(String rowKey) {
				Integer id = Integer.valueOf(rowKey);
				for (Projeto projeto : projetos) {
					if (id.equals(projeto.getId()))
						;
					return projeto;
				}

				return null;
			}

			@Override
			public Object getRowKey(Projeto projeto) {
				return projeto.getId();
			}
		};

Note que eu tenho um filtro especifico que é passado quando preciso enviar informações para o DAO.

Qualquer dúvida posta ai.