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

No xhtml: #{livroBean.autores}, no LivroBean: List<Autor> getAutores(). Por que assinaturas diferentes?

Não entendi porque no xhtml é usado a EL #{livroBean.autores} sendo que o nome do método é getAutores. Ao tentar deixar ambos com o nome getAutores, por exemplo, é gerado: livro.xhtml @35,58 value="#{livroBean.getAutores}": Property [getAutores] not found on type [br.com.caelum.livraria.bean.LivroBean]

2 respostas
solução!

Olá Carlos,

Ocorre o seguinte, no mundo Java existe um padrão onde popularmente chamamos de métodos getter/setter, ele consiste no seguinte:

Primeiramente, todos os atributos das classes devem ser privados, logo no seu caso, a lista de autores deve estar declarada mais ou menos como abaixo:

private List<Autor> autores;

Como podemos observar acima, o atributo por ser privado não pode ser acessado de fora da sua classe, para que o JSF possa ler esse atributo será necessário criar um getter para ele, conforme o exemplo abaixo:

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

Utilizando esse método o JSF conseguirá acessar os valores da sua lista.

Como esse padrão é bastante difundido na comunidade Java o JSF o utiliza, por isso quando você diz para o JSF que deseja acessar sua lista de autores, o JSF tentará chamar o método getter dele, por isso que funciona normalmente, pois você está indicando ao JSF o atributo que ele deve acessar e não o método.

Quando você passa o termo getAutores para o JSF, na verdade ele tenta chamar o método getGetAutores, como esse método não existe na sua classe o JSF vai deduzir que não existe um atributo chamado getAutores e por isso ele te mostra a mensagem de erro:

Property [getAutores] not found

Agora entendi Denis Ricci.

Muito obrigado pelo esclarecimento! :)

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