1
resposta

Filtro Data Lançamento não funciona

Bom dia professor,

Ao tentar utilizar o filtro no campo Data Lançamento o mesmo não consegue encontrar nenhum registro na tabela. A princípio não encontrei erros no código. Agradeço se puder ajudar.

livro.xhtml

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:f="http://xmlns.jcp.org/jsf/core"
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
    xmlns:p="http://primefaces.org/ui">

<ui:composition template="_template.xhtml">
    <f:metadata>
        <f:viewParam name="livroId" value="#{livroBean.livro.id}" />
        <f:viewAction action="#{livroBean.carregaPelaId}"
            if="#{param.livroId != null}"></f:viewAction>
    </f:metadata>


    <ui:define name="titulo">
        <p:panelGrid>Novo Livro</p:panelGrid>
    </ui:define>

    <ui:define name="conteudo">
        <h:form>
            <p:messages id="mensagens" />
            <br />
            <p:fieldset legend="Dados do Livro">
                <p:panelGrid columns="2">

                    <p:outputLabel value="Titulo:" for="titulo" />
                    <p:inputText id="titulo" value="#{livroBean.livro.titulo}"
                        required="true" requiredMessage="Título obrigatório!"
                        validatorMessage="Título não pode ser superior a 40 caracteres">
                        <f:validateLength maximum="40" />
                        <f:ajax execute="titulo" render="mensagens" event="blur" />
                    </p:inputText>

                    <p:outputLabel value="ISBN:" for="isbn" />
                    <p:inputMask id="isbn" value="#{livroBean.livro.isbn}"
                        mask="999-9-99-999999-9"
                        validator="#{livroBean.comecaComDigitoUm}">
                        <f:ajax execute="isbn" render="mensagens" event="keypress" />
                    </p:inputMask>

                    <p:outputLabel value="Preço:" for="preco" />
                    <p:inputNumber id="preco" value="#{livroBean.livro.preco}"
                        validatorMessage="Valor deve estar entre R$1.00 e R$1000.00"
                        symbol="R$" symbolPosition="p" decimalSeparator=","
                        thousandSeparator=".">
                        <f:validateDoubleRange minimum="1.00" maximum="1000.00" />
                    </p:inputNumber>

                    <p:outputLabel value="Data de Lançamento:" for="dataLancamento" />
                    <p:calendar id="dataLancamento" pattern="dd/MM/yyyy"
                        value="#{livroBean.livro.dataLancamento.time}">
                        <f:passThroughAttribute name="type" value="date" />
                        <f:passThroughAttribute name="required" value="true" />
                        <f:convertDateTime pattern="dd/MM/yyyy" />
                    </p:calendar>
                </p:panelGrid>
            </p:fieldset>
            <br />
            <p:fieldset legend="Dados do Autor">
                <p:panelGrid columns="4" styleClass="ui-noborder">
                    <p:outputLabel value="Selecione o Autor:" for="autor" />
                    <p:selectOneMenu value="#{livroBean.autorId}" id="autor">
                        <f:selectItems value="#{livroBean.autores}" var="autor"
                            itemLabel="#{autor.nome}" itemValue="#{autor.id}" />
                    </p:selectOneMenu>
                    <p:commandButton value="Gravar Autor" icon="fa fa-plus"
                        action="#{livroBean.gravarAutor}" process="@this autor"
                        update="tabelaAutores">
                    </p:commandButton>

                    <p:commandLink value="Cadastrar novo autor"
                        action="autor?faces-redirect=true" immediate="true" />
                </p:panelGrid>

                <p:dataList id="tabelaAutores" title="Autores do Livro"
                    emptyMessage="Nenhum autor cadastrado para o livro"
                    value="#{livroBean.autoresDoLivro}" var="autor" type="unordered"
                    itemStyleClass="fa fa-arrow-circle-right">

                    <f:facet name="header">Autores do Livro</f:facet>

                    #{autor.nome}
                    <p:commandLink styleClass="fa fa-fw fa-remove"
                        style="text-decoration:none"
                        action="#{livroBean.removerAutorDoLivro(autor)}" process="@this"
                        update="tabelaAutores" />

                </p:dataList>

            </p:fieldset>
            <br />
            <h:commandButton value="Gravar" action="#{livroBean.gravar}">
                <!-- <f:ajax execute="@form" render="@form :formTabelaLivros:tabelaLivros" /> -->
            </h:commandButton>
            <br />
        </h:form>

        <br />

        <h:form id="formTabelaLivros">
            <p:dataTable id="tabelaLivros" value="#{livroBean.livros}"
                var="livro" paginator="true" rows="5">
                <f:facet name="header">Livros</f:facet>

                <p:column headerText="Título" sortBy="#{livro.titulo}"
                    filterBy="#{livro.titulo}" filterMatchMode="startsWith">
                    <p:outputLabel value="#{livro.titulo}" />
                </p:column>

                <p:column headerText="ISBN" sortBy="#{livro.isbn}"
                    filterBy="#{livro.isbn}" filterMatchMode="contains">
                    <p:outputLabel value="#{livro.isbn}" />
                </p:column>

                <p:column headerText="Preço" sortBy="#{livro.preco}"
                    filterBy="#{livro.preco}" filterFunction="livroBean.precoEhMenor">
                    <h:outputText value="#{livro.preco}">
                        <f:convertNumber type="currency" pattern="R$ #0.00"
                            currencySymbol="R$" locale="pt_BR" />
                    </h:outputText>
                </p:column>

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

                <p:column headerText="Alterar">
                    <h:commandLink value="Alterar"
                        action="#{livroBean.carregar(livro)}" />
                </p:column>

                <p:column headerText="Remover">
                    <h:commandLink value="Remover" action="#{livroBean.remover(livro)}"></h:commandLink>
                </p:column>
            </p:dataTable>
        </h:form>
    </ui:define>

    <ui:define name="textoRodape">
        Cadastro de Livros
    </ui:define>

</ui:composition>
</html>

LivroBean.java

package br.com.caelum.livraria.bean;

import java.util.List;
import java.util.Locale;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.ValidatorException;

import br.com.caelum.livraria.dao.DAO;
import br.com.caelum.livraria.modelo.Autor;
import br.com.caelum.livraria.modelo.Livro;

@ManagedBean
@ViewScoped
public class LivroBean {

    private Integer autorId;
    private Livro livro = new Livro();
    private List<Livro> livros;

    public Integer getAutorId() {
        return autorId;
    }

    public void setAutorId(Integer autorId) {
        this.autorId = autorId;
    }

    public List<Autor> getAutores() {
        return new DAO<Autor>(Autor.class).listaTodos();
    }

    public void gravarAutor() {
        Autor autor = new DAO<Autor>(Autor.class).buscaPorId(this.autorId);
        this.livro.adicionaAutor(autor);
    }

    public List<Autor> getAutoresDoLivro() {
        return this.livro.getAutores();
    }

    public List<Livro> getLivros() {

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

        if (this.livros == null) {
            this.livros = dao.listaTodos();
        }

        return this.livros;
    }

    public Livro getLivro() {
        return livro;
    }

    public void gravar() {
        System.out.println("Gravando livro " + this.livro.getTitulo());

        if (livro.getAutores().isEmpty()) {
            FacesContext.getCurrentInstance().addMessage("autor",
                    new FacesMessage("Livro deve ter pelo menos um Autor"));
            return;
        }

        if (this.livro.getId() == null) {
            // se novo adiciona
            DAO<Livro> dao = new DAO<Livro>(Livro.class);
            dao.adiciona(this.livro);

            // atualiza List da tabela de livros
            this.livros = dao.listaTodos();

        } else {
            new DAO<Livro>(Livro.class).atualiza(this.livro);
        }
        // para retornar formulário limpo
        this.livro = new Livro();

    }

    public void comecaComDigitoUm(FacesContext fc, UIComponent component, Object value) {
        String valor = value.toString();
        if (!valor.startsWith("1")) {
            throw new ValidatorException(new FacesMessage("Deveria começar com 1"));
        }
    }

    public void remover(Livro livro) {
        System.out.println("Removendo livro " + livro.getTitulo());
        new DAO<Livro>(Livro.class).remove(livro);
    }

    public void carregar(Livro livro) {
        System.out.println("Carregando livro " + livro.getTitulo());
        this.livro = livro;
    }

    public void removerAutorDoLivro(Autor autor) {
        this.livro.removeAutor(autor);
    }

    public void carregaPelaId() {
        Integer id = this.livro.getId();
        System.out.println("Carregando Livro de código: " + id);
        this.livro = new DAO<Livro>(Livro.class).buscaPorId(id);
        if (this.livro == null) {
            this.livro = new Livro();
        }

    }

    public boolean precoEhMenor(Object valorColuna, Object filtroDigitado, Locale locate) {

        // tirando espaços do filtro
        String textoDigitado = (filtroDigitado == null) ? null : filtroDigitado.toString().trim();

        System.out.println("Filtrando pelo " + textoDigitado + ", Valor do elemento: " + valorColuna);

        // o filtro é nulo ou vazio?
        if (textoDigitado == null || textoDigitado.equals("")) {
            return true;
        }

        // elemento da tabela é nulo?
        if (valorColuna == null) {
            return false;
        }

        try {
            // fazendo o parsing do filtro para converter para Double
            Double precoDigitado = Double.valueOf(textoDigitado);
            Double precoColuna = (Double) valorColuna;

            // comparando os valores, compareTo devolve um valor negativo se o
            // value é menor do que o filtro
            return precoColuna.compareTo(precoDigitado) < 0;

        } catch (NumberFormatException e) {

            // usuario nao digitou um numero
            return false;
        }
    }

}

Livro.java

package br.com.caelum.livraria.modelo;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
public class Livro {

    @Id
    @GeneratedValue
    private Integer id;

    private String titulo;
    private String isbn;
    private double preco;

    @Temporal(TemporalType.DATE)
    private Calendar dataLancamento = Calendar.getInstance();

    @ManyToMany(fetch=FetchType.EAGER)
    private List<Autor> autores = new ArrayList<Autor>();

    public List<Autor> getAutores() {
        return autores;
    }

    public void adicionaAutor(Autor autor) {
        this.autores.add(autor);
    }

    public Livro() {
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

    public String getIsbn() {
        return isbn;
    }

    public void setIsbn(String isbn) {
        this.isbn = isbn;
    }

    public double getPreco() {
        return preco;
    }

    public void setPreco(double preco) {
        this.preco = preco;
    }

    public Calendar getDataLancamento() {
        return dataLancamento;
    }

    public void setDataLancamento(Calendar dataLancamento) {
        this.dataLancamento = dataLancamento;
    }

    public void removeAutor(Autor autor) {
        this.autores.remove(autor);
    }


}

Grato.

1 resposta

Fala aí Bruno tudo bem?

Cara se eu não estou enganado os atributo filterMatchMode é utilizado com strings, talvez por isso você não consiga filtrar a data.

Para a data é recomendado que você use o filterFunction com a mesma ideia que você usou no seu método precoEhMenor.

Espero ter ajudado e bons estudos.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software