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

Erro na Data de Lancamento: javax.el.PropertyNotFoundException

Olá,

Estou recebendo uma exception na aula de conversão de data e não consigo encontrar o porque:

HTTP Status 500 - javax.el.PropertyNotFoundException: /livro.xhtml @21,85 value="#{livroBean.livro.dataLancamento.time}": Target Unreachable, 'dataLancamento' returned null

Pela mensagem da exception, não consegui acessar o valor por causa do atributo dataLancamente estar nulo, não entendo o porque.

Minha view:

<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 Lancamento" 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>
            <h:commandButton value="Gravar" action="#{livroBean.gravar}" />
        </fieldset>

Meu Bean:

package br.com.alura.livraria.bean;

import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.persistence.EntityManager;

import br.com.alura.livraria.dao.AutorDAO;
import br.com.alura.livraria.dao.LivroDAO;
import br.com.alura.livraria.model.Autor;
import br.com.alura.livraria.model.Livro;
import br.com.alura.livraria.util.JpaUtil;


@ManagedBean(name="livroBean")
@ViewScoped
public class LivroBean {

    private Livro livro = new Livro();
    private List<Livro> livros;
    private List<Autor> autores;

    private Integer autorId;

    private EntityManager em = new JpaUtil().getEntityManager();
    AutorDAO autorDAO = new AutorDAO(em);
    LivroDAO livroDAO = new LivroDAO(em);

    public List<Autor> getAutores() {        
        if(autores == null){            
            autores = autorDAO.obterTodosAutores();            
        }
        return autores;
    }

    public List<Livro> getLivros() {
        livros = livroDAO.obterTodosLivros();
        return livros;
    }

    public Livro getLivro() {
        return livro;
    }

    public Integer getAutorId() {
        return autorId;
    }

    public List<Autor> getAutoresDoLivro(){
        //return livroDAO.obterAutoresDoLivro(livro);
        return livro.getAutores();
    }

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

    public void setLivro(Livro livro) {
        this.livro = livro;
    }

    public void gravar(){

        System.out.println("Gravando o livro: " + livro.getTitulo());

        if(livro.getAutores().isEmpty()){
            throw new RuntimeException("Livro deve ter ao menos um autor!");
        }
        EntityManager em = new JpaUtil().getEntityManager();
        LivroDAO dao = new LivroDAO(em);
        dao.persist(livro);

        System.out.println("Gravou o livro: " + livro.getTitulo());
        clear();

    }

    public void clear(){
        livro = new Livro();
    }


    public void gravarAutor(){
        Autor autor = autorDAO.obterAutorPorId(autorId);
        livro.addAutor(autor);
        System.out.println("Gravou o autor " + autor.getNome() + " Para o livro: " + livro.getTitulo());
    }

}

E meu Model:

package br.com.alura.livraria.model;

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

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.SequenceGenerator;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@NamedQueries({
    @NamedQuery(name = "obterAutoresDoLivro", query = "select l.autores from Livro l"),
    @NamedQuery(name = "obterTodosLivros", query = "select l from Livro l")
})

@Entity
@SequenceGenerator(name = "SEQ_LIVRO", sequenceName = "SEQ_LIVRO", initialValue = 1, allocationSize = 1)
public class Livro {

    public static final String OBTER_LIVROS_POR_AUTOR = "obterLivrosPorAutor";
    public static final String OBTER_AUTORES_DO_LIVRO = "obterAutoresDoLivro";
    public static final String OBTER_TODOS_LIVROS = "obterTodosLivros";

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_LIVRO")
    private int id;
    private String titulo;
    private String isbn;
    private Double preco;

    @Temporal(TemporalType.DATE)
    private Calendar dataLancamento;

    @ManyToMany
    private List<Autor> autores = new ArrayList<Autor>();

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

    public int getId() {
        return id;
    }

    public void setId(int 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 List<Autor> getAutores() {
        return autores;
    }

    public void setAutores(List<Autor> autores) {
        this.autores = autores;
    }

}

Agradeço qualquer ajuda a identificar o que pode estar ocorrendo.

5 respostas

Vê se assim soluciona o erro!

<h:inputText id="dataLancamento" value="#{livroBean.livro.dataLancamento}">

Olá Victor, já havia tentando assim, mas ele retorna uma exception dizendo que não consegue converter de util para calendar, igual foi explicado na aula :/

HTTP Status 500 - javax.el.ELException: /livro.xhtml @21,80 value="#{livroBean.livro.dataLancamento}": Cannot convert 15/12/90 00:00 of type class java.util.Date to class java.util.Calendar

Troque o tipo de dados do data de lançamento de Calendar para Date.

solução!

Estava vendo aqui, seu xhtml estava certo, só não vi isso na declaração na classe do modelo.

private Calendar dataLancamento = Calendar.getInstance();

Verdade Victor! Falta de atenção minha :/

Os dois modos que você citou funcionaram: Trocar para util.Date e usar apenas o #{livroBean.livro.dataLancamento}, e Instanciar o Calendar e usar {livroBean.livro.dataLancamento.time}

Valeu!