H:datatable - Propriedade não encontrada

Boa noite pessoal, estou com um probleminha aqui. Ja tentei de tudo e não funcionou.

O que vou descrever é uma situação igual a que está ocorrendo (mesma estrutura), porém com classes diferentes, devido as classes do projeto real serem muito extensas. O que ocorre é o seguinte:

Tenho uma classe Pessoa com os atributos Nome e Email. Essa classe Pessoa(uma instância dela) é um atributo da minha classe PessoaBean. Na classe PessoaBean possuo um método, chamado listarPessoas(), que retorna uma lista de pessoas. Na minha pagina jsf tenho um h:datatable que tem como value “beanPessoa.listarPessoas”, sendo beanPessoa um Managed Bean mapeado para a classe PessoaBean e registrado no faces-config e listaPessoas um método da classe PessoaBean que retorna um lista de pessoas.

Quando tento exibir a página ocorre o seguinte erro:

javax.servlet.ServletException: /listarpessoas.jsp(16,12) ‘#{beanPessoa.listarPessoas}’ Property ‘listarPessoas’ not found on type beans.PessoaBean
javax.faces.webapp.FacesServlet.service(FacesServlet.java:256)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)


Como disse, listarPessoas é um método da classe PessoaBean e não uma propriedade.

OBS: No exemplo o próprio método listarPessoas cria uma lista de pessoas e retorna, porém no projeto real a lista de objetos vem do banco de dados. Sei que isso não interfere pois o erro que ocorre e o mesmo em ambos os casos.

Segue o código que estou utilizando.

Pessoa.java

package modelos;

public class Pessoa {

    public Pessoa() { }

    private String nome;
    private String email;

    //Get`s e Set`s

}

PessoaBean.java

package beans;

import java.util.List;
import modelos.Pessoa;

public class PessoaBean {
    
    public PessoaBean() { }

    private Pessoa pessoa;

    //Get`s e Set`s

    public List<Pessoa> listarPessoas() {

        List<Pessoa> pessoas = null;

        pessoa = new Pessoa();
        pessoa.setNome("Fulano");
        pessoa.setEmail("111@111.com");
        pessoas.add(pessoa);

        pessoa = new Pessoa();
        pessoa.setNome("Beltrano");
        pessoa.setEmail("111@111.com");
        pessoas.add(pessoa);

        pessoa = new Pessoa();
        pessoa.setNome("Mukirana");
        pessoa.setEmail("222@222.com");
        pessoas.add(pessoa);

        return pessoas;
    }
}

faces-config.xml

<?xml version='1.0' encoding='UTF-8'?>

<faces-config version="1.2" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd">
    <managed-bean>
        <managed-bean-name>beanPessoa</managed-bean-name>
        <managed-bean-class>beans.PessoaBean</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
    </managed-bean>
</faces-config>

listarpessoas.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>

<%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<f:view>
    <html>
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
            <title>JSP Page</title>
        </head>
        <body>
            <h:dataTable value="#{beanPessoa.listarPessoas}" var="pessoa">
                <h:column><h:outputText value="#{pessoa.nome}"/></h:column>
                <h:column><h:outputText value="#{pessoa.email}"/></h:column>
            </h:dataTable>
        </body>
    </html>
</f:view>

Abraços… =)

O value do dataTable tem que ser um DataModel.
Na classe PessoaBean crie um DataModel, por exemplo private DataModel dataModel;
Crie também um get pro dataModel:

public DataModel getDataModel() {         
         dataModel = new ListDataModel();
         List<Pessoa> pessoas = new ArrayList<Pessoa>();  
   
         pessoa = new Pessoa();  
         pessoa.setNome("Fulano");  
         pessoa.setEmail("111@111.com");  
         pessoas.add(pessoa);  
   
         pessoa = new Pessoa();  
         pessoa.setNome("Beltrano");  
         pessoa.setEmail("111@111.com");  
         pessoas.add(pessoa);  
   
         pessoa = new Pessoa();  
         pessoa.setNome("Mukirana");  
         pessoa.setEmail("222@222.com");  
         pessoas.add(pessoa);  
   
         dataModel.setWrappedData(pessoas);
}

[quote=dsjbv]O value do dataTable tem que ser um DataModel.
Na classe PessoaBean crie um DataModel, por exemplo private DataModel dataModel;

[/quote]

Opa, cara o dataTable é capaz de fazer iterações não só em DataModel, mas também em: ArrayList, List, ResulSet e outros…
Se eu criar na minha classe private List pessoas com seus respectivos GETS e SETS ai funciona blz.
A questão é que dessa forma para toda lista que eu quizer retornar vou ter que esta amarrado a um GET E SET e sei que isso não é necessário.

Por exemplo:

Supondo que eu queira retorna uma lista de pessoas que o nome comece com a letra A e outra de pessoas que o nome comece com a letra B.
eu posso ter uma lista de pessoas e dois métodos que serão responsáveis por fazer esse filtro e retornaram um List apenas com os valores desejados.

o value do dataTable não necessita ser obrigatoriamente uma propriedade do meu bean, pode ser um método que retorne, por exemplo, uma lista. O problema é que estou passando um método que retorna uma lista e surge esse erro, dizendo que a propriedade “listarPessoas” não foi encontrada, sendo que “listarPessoas” não é uma propriedade e sim um método.

Se eu nao me engano ao colocar os parentes finais ele ja identifica como se fosse método.
Ficando assim.

value="#{beanPessoa.listarPessoas()}" 

Se assim não funcionar creio que a unica possibilidade é vc se amarrar nos gets e sets…Criar um atributo listaPessoas, e um objeto Jsf ligado a um actionListener, que por sua vez fara a seleção de qual lista de pessoas exibir.