2
respostas

Erro na classe LivroDataModel

1) No construtor da classe LivroDataModel faltou instanciar a variável dao:

    public LivroDataModel() {
        DAO<Livro> dao = new DAO<Livro>(Livro.class);
        super.setRowCount(dao.quantidadeDeElementos());
    }

2) Se o método ‘load’ da classe LivroDataModel está sendo sobrescrito, onde está a primeira implementação? No meu projeto não achei… Nesse mesmo método, também está faltando instanciar a variável dao.

3) Deu erro. Mesmo corrigindo os itens acima, deu o seguinte erro:

HTTP Status 500 - Lazy loading is not implemented.

type Exception report
message Lazy loading is not implemented.
description The server encountered an internal error that prevented it from fulfilling this request.
exception
javax.servlet.ServletException: Lazy loading is not implemented.
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:671)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
root cause
java.lang.UnsupportedOperationException: Lazy loading is not implemented.
    org.primefaces.model.LazyDataModel.load(LazyDataModel.java:108)
    org.primefaces.component.datatable.DataTable.loadLazyData(DataTable.java:1026)
    org.primefaces.component.datatable.DataTableRenderer.preRender(DataTableRenderer.java:97)
    org.primefaces.component.datatable.DataTableRenderer.encodeEnd(DataTableRenderer.java:85)
    javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:920)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1863)
    javax.faces.render.Renderer.encodeChildren(Renderer.java:176)
    javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:890)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1856)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
    com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:458)
    com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:134)
    com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120)
    com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219)
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:659)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
note The full stack trace of the root cause is available in the Apache Tomcat/9.0.0.M15 logs.
2 respostas

Cadê seu código? O que está errado está na parte que vc não postou aqui.. em relação a sobreescrita, vc não achou nada pq isso está na classe do primefaces.

Classe LivroDataModel

package br.com.caelum.livraria.modelo;

import java.util.List;
import java.util.Map;

import javax.swing.SortOrder;

import org.primefaces.model.LazyDataModel;

import br.com.caelum.livraria.dao.DAO;

public class LivroDataModel extends LazyDataModel<Livro>{

    private static final long serialVersionUID = 1L;

    public LivroDataModel() {
        DAO<Livro> dao = new DAO<Livro>(Livro.class);
        super.setRowCount(dao.quantidadeDeElementos());
    }

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

        return dao.listaTodosPaginada(inicio, quantidade, "titulo", titulo);
    }
}

Método quantidadeDeElementos na classe DAO:

    public int quantidadeDeElementos() {
        EntityManager em = new JPAUtil().getEntityManager();
        long result = (Long) em.createQuery("select count(n) from " + classe.getSimpleName() + " n")
                .getSingleResult();
        em.close();

        return (int) result;
    }

novo atributo e seu getter:

    private LivroDataModel livroDataModel = new LivroDataModel();

    public LivroDataModel getLivroDataModel() {
        return livroDataModel;
    }

Form

<h:form id="formTabelaLivros">
                <p:dataTable value="#{livroBean.livroDataModel}" var="livro" id="tabelaLivros" paginator="true" rows="5" lazy="true">
                    <f:facet name="header">Livros cadastrados</f:facet>
                    <p:column headerText="Título" sortBy="#{livro.titulo}" filterBy="#{livro.titulo}" filterMatchMode="startsWith">
                        <h:outputText value="#{livro.titulo}" />
                    </p:column>

………