Solucionado (ver solução)
Solucionado
(ver solução)
9
respostas

ordenar por data na tabela livros retorna tabela vazia

pessoal apliquei os filter e sort, porém a coluna data retorna tabela vazia.

set 15, 2017 12:15:25 PM com.sun.faces.application.view.FaceletViewHandlingStrategy handleRenderException
GRAVE: Error Rendering View[/livro.xhtml]
java.lang.RuntimeException
    at br.com.caelum.livraria.modelo.LazySorter.compare(LazySorter.java:32)
    at br.com.caelum.livraria.modelo.LazySorter.compare(LazySorter.java:1)
    at java.util.TimSort.countRunAndMakeAscending(TimSort.java:355)
    at java.util.TimSort.sort(TimSort.java:220)
    at java.util.Arrays.sort(Arrays.java:1512)
    at java.util.ArrayList.sort(ArrayList.java:1454)
    at java.util.Collections.sort(Collections.java:175)
    at br.com.caelum.livraria.modelo.LivroDataModel.load(LivroDataModel.java:31)
    at org.primefaces.component.datatable.DataTable.loadLazyData(DataTable.java:1116)
    at org.primefaces.component.datatable.feature.SortFeature.encode(SortFeature.java:102)
    at org.primefaces.component.datatable.DataTableRenderer.encodeEnd(DataTableRenderer.java:85)
    at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:920)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1863)
    at com.sun.faces.context.PartialViewContextImpl$PhaseAwareVisitCallback.visit(PartialViewContextImpl.java:582)
    at com.sun.faces.component.visit.PartialVisitContext.invokeVisitCallback(PartialVisitContext.java:183)
    at org.primefaces.component.api.UIData.visitTree(UIData.java:827)
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700)
    at javax.faces.component.UIForm.visitTree(UIForm.java:371)
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700)
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700)
    at com.sun.faces.context.PartialViewContextImpl.processComponents(PartialViewContextImpl.java:403)
    at com.sun.faces.context.PartialViewContextImpl.processPartial(PartialViewContextImpl.java:322)
    at org.primefaces.context.PrimePartialViewContext.processPartial(PrimePartialViewContext.java:57)
    at javax.faces.component.UIViewRoot.encodeChildren(UIViewRoot.java:1004)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1856)
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:432)
    at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:134)
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:659)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:475)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:651)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:498)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:796)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1374)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:748)
9 respostas

classe LazySorter

package br.com.caelum.livraria.modelo;

import java.lang.reflect.Field;
import java.util.Comparator;

import org.primefaces.model.SortOrder;



    public class LazySorter implements Comparator<Livro> {

        private String sortField;

        private SortOrder sortOrder;

        public LazySorter(String sortField, SortOrder sortOrder) {
            this.sortField = sortField;
            this.sortOrder = sortOrder;
        }

        public int compare(Livro livro1, Livro livro2) {
            try {
                Field field = Livro.class.getDeclaredField(this.sortField);
                field.setAccessible(true);
                Object value1 = field.get(livro1);
                Object value2 = field.get(livro2);
                field.setAccessible(false);
                int value = ((Comparable) value1).compareTo(value2);

                return SortOrder.ASCENDING.equals(sortOrder) ? value : -1 * value;
            } catch (Exception e) {
                throw new RuntimeException();
            }
        }
    }

Coluna Data

    <p:column sortBy="#{livro.dataLancamento.time}">
                    <f:facet name="header">Data</f:facet>
                    <h:outputText value="#{livro.dataLancamento.time}">
                        <f:convertDateTime pattern="dd/MM/yyyy"
                            timeZone="America/Sao_Paulo" />
                    </h:outputText>
                </p:column>

Anderson,

tente alterar o para esse código:

<p:column headerText="Data de Lançamento"
    sortBy="#{livro.dataLancamento.time}"
    filterBy="#{livro.dataLancamento.time}" filterMatchMode="contains">
    <h:outputText value="#{livro.dataLancamento.time}">
        <f:convertDateTime pattern="dd/MM/yyyy"
                timeZone="America/Sao_Paulo" />
    </h:outputText>
</p:column>

Boa noite Samir,

Continuou dando a mesma saída no console e continuou mostrando a tabela em branco

Oi Anderson, boa noite, vc pode passar o seu LivroDataModel?

package br.com.caelum.livraria.modelo;

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

import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SortOrder;

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


public class LivroDataModel extends LazyDataModel<Livro>{

     DAO<Livro> dao = new DAO<Livro>(Livro.class);


     public LivroDataModel() {
        super.setRowCount(dao.quantidadeDeElementos());


    }
     @Override
        public List<Livro> load(int inicio, int quantidade, String campoOrdenacao, SortOrder sentidoOrdenacao, Map<String, Object> filtros) {
            String titulo = (String) filtros.get("titulo"); 
            List<Livro> data = dao.listaTodosPaginada(inicio, quantidade, "titulo", titulo);
     // sort
     if (campoOrdenacao != null) {
         Collections.sort(data, new LazySorter(campoOrdenacao, sentidoOrdenacao));
     }

     return data;

    }
}

Oi, Anderson

tudo bem?

Sua exception não tem a parte do caused by. Ele não aparece mesmo ou ficou de fora na hora de compartilhar aqui?

Aproveitando, chegou a testar incremental pra ver em qual parte específica o código para de funcionar? Essa informação vai ajudar muito a investigação do problema. Comente, por exemplo, o Collections#sort que você faz no método load, para ver se sem usar o lazySorter todo o resto funciona.

Assim vamos saber exatamente onde investigar (;

E só pra confirmar, esse seu código está dentro de um h:form, certo?

Oi Anderson, a questão pros filtros não funcionarem é o método load do DataModel.

@Override
     public List<Livro> load(int inicio, int quantidade, String campoOrdenacao, SortOrder sentidoOrdenacao, Map<String, Object> filtros) {
            String titulo = (String) filtros.get("titulo"); 
            List<Livro> data = dao.listaTodosPaginada(inicio, quantidade, "titulo", titulo);
     // sort
     if (campoOrdenacao != null) {
         Collections.sort(data, new LazySorter(campoOrdenacao, sentidoOrdenacao));
     }

na hora que chamamos o listaTodosPaginada do DAO, estamos passando apenas titulo para filtrar.

solução!

Desculpem a demora, mas nesse problema o erro era na expressão, estava sortBy="#{livro.dataLancamento.time}", retirei o time e ordenou normalmente a data

<p:column headerText="Data de Lançamento"
                    sortBy="#{livro.dataLancamento}"
                    filterBy="#{livro.datalancamento.time}" filterMatchMode="contains">
                    <h:outputText value="#{livro.dataLancamento.time}">
                        <f:convertDateTime pattern="dd/MM/yyyy"
                            timeZone="America/Sao_Paulo" />
                    </h:outputText>
                </p:column>