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

Data nula

Na aula 5, na validação de data, ao 'gravar'(associar) autor ao livro acaba surgindo um erro : "avax.servlet.ServletException: javax.el.PropertyNotFoundException: /livro.xhtml @25,85 value="#{livroBean.livro.dataLancamento.time}": Target Unreachable" Essa duvida foi sanada em outro tópico, onde é sugerido que se instancie a data, na classe Livro, da seguinte forma: "Calendar data = Calendar.getInstance();" Dessa forma funciona, porém a input de preenchimento de data sempre está preenchido com a data atual. Seguem bean e xhtml para análise.

package br.com.ph.livraria.bean;

import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

import br.com.ph.livraria.dao.DAO;
import br.com.ph.livraria.model.Autor;
import br.com.ph.livraria.model.Livro;

@ManagedBean
@ViewScoped
public class LivroBean {

    private Livro livro = new Livro();
    private Integer autorId;

    public Livro getLivro(){
        return this.livro;
    }

    @PostConstruct
    public void criacao(){
        System.out.println("Objeto LivroBean foi criado!");
    }

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

        if(livro.getAutores().isEmpty()) {
            throw new RuntimeException("Livro deve ter pelo menos um Autor");
        }

        new DAO<Livro>(Livro.class).adiciona(this.livro);
        this.livro = new Livro();
    }

    public void gravaAutor(){
        Autor autor = new DAO<Autor>(Autor.class).buscaPorId(this.autorId);
        System.out.println(">>>>>" + autor.getNome());
        this.livro.adicionaAutor(autor);
    }

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

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

    public List<Livro> getLivros(){
        return new DAO<Livro>(Livro.class).listaTodos();
    }

    public Integer getAutorId() {
        return autorId;
    }

    public void setAutorId(Integer autorId) {
        this.autorId = autorId;
    }
}
<?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:f="http://java.sun.com/jsf/core">

<h:body>
    <h1>Novo Livro</h1>
    <h:form>
        <h:messages/>
        <fieldset>
            <legend>Dados do Livro</legend>
            <h:panelGrid columns="2">

                <h:outputLabel value="Titulo:" for="titulo" />
                <h:inputText id="titulo" value="#{livroBean.livro.titulo}" />

                <h:outputLabel value="ISBN:" for="isbn" />
                <h:inputText id="isbn" value="#{livroBean.livro.isbn}" />

                <h:outputLabel value="Preço:" for="preco" />
                <h:inputText id="preco" value="#{livroBean.livro.preco}" />

                <h:outputLabel value="Data de Lançamento:" for="dataLancamento" />
                <h:inputText id="dataLancamento" value="#{livroBean.livro.dataLancamento.time}">
                    <f:convertDateTime pattern="dd/MM/yyyy" timeZone="America/Sao_Paulo" />
                </h:inputText>

            </h:panelGrid>
        </fieldset>

        <fieldset>
            <legend>Dados do Autor</legend>
                <h:outputLabel value="Selecione Autor:" for="autor"/>
                    <h:selectOneMenu id="autor" value="#{livroBean.autorId}">
                        <f:selectItems value="#{livroBean.autores}" var="autor"
                            itemLabel="#{autor.nome}" itemValue="#{autor.id}"/>
                    </h:selectOneMenu>

                <h:commandButton value="Gravar Autor" action="#{livroBean.gravaAutor}"/>

                <h:dataTable value="#{livroBean.autoresDoLivro}" var="autor">
                    <h:column>
                        <h:outputText value="#{autor.nome}"/>
                    </h:column>
                </h:dataTable>
        </fieldset>

        <h:commandButton value="Gravar" action="#{livroBean.gravar}" />

        <fieldset>
            <legend>Livros Cadastrados</legend>
                <h:dataTable id="tabelaLivros" value="#{livroBean.livros}" var="livro">
                    <h:column>
                        <f:facet name="header">Titulo</f:facet>
                        <h:outputText value="#{livro.titulo}"/>
                    </h:column>

                    <h:column>
                        <f:facet name="header">ISBN</f:facet>
                        <h:outputText value="#{livro.isbn}"/>
                    </h:column>

                    <h:column>
                        <f:facet name="header">Preço</f:facet>
                        <h:outputText value="#{livro.preco}"/>
                    </h:column>

                    <h:column>
                        <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>
                    </h:column>
                </h:dataTable>
        </fieldset>
    </h:form>
</h:body>

</html>
6 respostas

Paulo,

Seu livro tem tem todos getters e setters para os atributos ?

Olá Matheus, perdão pela demora. Sim, tenho todos os getters e setters na minha classe livro sim.

Acho que isso pode te ajudar : https://www.primefaces.org/showcase/ui/input/calendar.xhtml

Olá Matheus; Então, meu problema está no fato de minha data sempre vir preenchida com a data atual (por instanciar Data na classe livro). Eu esperava conseguir fazer este campo vir vazio, sem que na associação do autor eu recebesse aquele erro (que aparece sempre que tiro a instancia do atributo). Talvez seja uma solução para o ponto em que me encontro na aula, mas foi uma dúvida que me intrigou, afinal, pq ele não aceita um dado nulo como os outros atributos, mesmo sem validação nenhuma?

solução!

Acredito que devido ao parser que está sendo executado, ele não consegue parsear nada null

No final das contas é isso mesmo. Procurei outras maneiras, mas aí é algo que fica mais à frente, do ponto em que estou, no curso. Só não entendo por que o xhtml renderiza em um primeiro momento, mesmo com a data vazia, porém não aceita o mesmo comportamento depois da primeira request.