1
resposta

p:commandLink não funciona com DataModel

Estou utlizando p:dataTable com paginacao, para isso eu retorno uma lista de um dataModel, mas os links na linha que servem para alterar e excluir param de funcionar...

Quando o retorno é uma lista do objeto tudo funciona, mas quando é dataModel (necessario para paginação) para de funcionar...


<p:dataTable value="#{listaObjetosBean.dataModel}" var="objeto" paginator="true" rows="5" lazy="true">

<p:column headerText="Ações">
<p:commandLink id="ajax" update=":listagem" actionListener="#{objetoBean.remover(objeto)}" ajax="true">
    <h:outputText value="Remover" />
</p:commandLink>
                    -
<p:commandLink value="Alterar" update=":insercao" >
    <f:setPropertyActionListener value="#{objeto}" target="#{objetoBean.objeto}" />
</p:commandLink>

import java.io.Serializable;
import java.util.List;
import java.util.Map;
import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SortOrder;

import br.com.dao.DAO;
import br.com.modelo.Objeto;

public class DataModelObjetos extends LazyDataModel<Objeto> implements Serializable {

    private static final long serialVersionUID = -6132969163305784568L;


    public List<Objeto> load(int inicio, int quantidade, String campoOrdenacao, SortOrder sentidoOrdenacao, Map<String,Object> filtros) {
        DAO<Objeto> dao = new DAO<Objeto>(Objeto.class);

        return dao.listaTodosPaginada(inicio, quantidade);
    }
}
DAO >>>

    public List<T> listaTodosPaginada(int firstResult, int maxResults) {
        EntityManager em = new JPAUtil().getEntityManager();
        CriteriaQuery<T> query = em.getCriteriaBuilder().createQuery(classe);
        query.select(query.from(classe));

        List<T> lista = em.createQuery(query).setFirstResult(firstResult)
                .setMaxResults(maxResults).getResultList();

        em.close();
        return lista;
    }
BEAN >>>

    private LazyDataModel<Objeto> dataModel;

    public ListaObjetosBean() {
        this.dataModel = new DataModelObjetos();

        DAO<Objeto> dao = new DAO<Objeto>(Objeto.class);
        this.dataModel.setRowCount(dao.contaTodos());
    }
A paginação esta funcionando perfeitamente, so os links dentro da tabela que pararam de funcionar...
1 resposta

O commandLink precisa que o metodo esteja dentro de um bean no caso a sua classe que estende DataModel não é um bean.

Em geral a classe DataModel serve apenas para gerar os dados para que seu bean passe a informação na view. Mas se quiser basta anotar a classe e transforma-la num bean que devera funcionar.