6
respostas

Erro em Jsf com o código da alura

Ao acessar a pagina livro,xhtml gera uma ecexeção: /livro.xhtml: Property 'carregarLivroPelaId' not found on type br.com.caelum.livraria.bean.LivroBean Porém esse método existe no LivroBean. Como posso corrigir esse problema? Obrigado pela atenção

6 respostas

Oi Luan,

A exception parece bem clara.. o método, do jeito que vc está referenciando, não está sendo achado pelo JSF. Pode colocar o seu código aqui? Pq parece que vc referenciou esse método em um lugar que o jsf ta esperando achar um getter para ele.

Também entendi assin, o problema que não entendi é que esse método existe. LivroBean: package br.com.caelum.livraria.bean;

import java.io.Serializable; import java.util.List;

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 implements Serializable {

private static final long serialVersionUID = 1L;

private Livro livro = new Livro();

private Integer autorId;

private Integer livroId;

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

public Integer getAutorId() { return autorId; }

public Livro getLivro() { return livro; }

public Integer getLivroId() { return livroId; }

public void setLivroId(Integer livroId) { this.livroId = livroId; }

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

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

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

public void gravarAutor() { Autor autor = new DAO(Autor.class).buscaPorId(this.autorId); this.livro.adicionaAutor(autor); System.out.println("Escrito por: " + autor.getNome()); }

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) { new DAO(Livro.class).adiciona(this.livro); } else { new DAO(Livro.class).atualiza(this.livro); }

this.livro = new Livro(); }

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

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

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

public String formAutor() { System.out.println("Chamanda do formulário do Autor."); return "autor?faces-redirect=true"; }

public void comecaComDigitoUm(FacesContext fc, UIComponent component, Object value) throws ValidatorException {

String valor = value.toString(); if (!valor.startsWith("1")) { throw new ValidatorException(new FacesMessage( "ISBN deveria começar com 1")); }

}

public void carregarLivroPelaId() { this.livro = new DAO(Livro.class).buscaPorId(livroId); }

} livro.xmhtl:

<?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">

Novo Livro

Dados do Livro

Dados do Autor

Título ISBN Preço Data Alterar Remover

O método pode existir, mas vc referenciou ele de um jeito que o jsf está achando que vc talvez esteja procurando por um getter e não pelo método em si.

e qual seria a maneira correta de chamar o método?

Depende, posta seu código. Se vc tiver referenciando o método numa action de uma botão, deveria ser do jeito que vc ta fazendo. Se vc tiver referenciando num value de um input, aí tem que ser sem () e precisa ter o getter e setter.

o bean: package br.com.caelum.livraria.bean;

import java.util.List;

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

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

@ManagedBean @ViewScoped public class AutorBean {

private Autor autor = new Autor();

private Integer autorId;

public Autor getAutor() { return autor; }

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

public void gravar() { System.out.println("Gravando autor " + this.autor.getNome());

if (this.autor.getId() == null) { new DAO(Autor.class).adiciona(this.autor); } else { new DAO(Autor.class).atualiza(this.autor); }

this.autor = new Autor();

//return "livro?faces-redirect=true"; }

public void carregar(Autor autor) { System.out.println("Carregando autor"); this.autor = autor; }

public void remover(Autor autor) { System.out.println("Removendo autor"); new DAO(Autor.class).remove(autor); }

public Integer getAutorId() { return autorId; }

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

public void carregarAutorPelaId() { this.autor = new DAO(Autor.class).buscaPorId(autorId); } }

e a pagina: <?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">

Novo Autor

Dados do Autor

Nome Alterar Remover