Problema com DataTable PrimeFaces JSF

Olá, como estão as coisas!?
bom o seguinte, estou começando agora com JSF, e estou utilizando o componente DataTable do PrimeFaces porém não estou conseguindo trazer meu resultado da pesquisa nesta tabela.
Gostaria de saber se alguem poderia me ajudar a realizar a busca nesta tabela.

Quando executado apresenta o seguinte erro :

exception

javax.servlet.ServletException: /pesquisafuncionario.xhtml @33,69 value="#{funcionarioBean.lista}": Property ‘lista’ not found on type br.com.jatendimento.bean.FuncionarioBean
javax.faces.webapp.FacesServlet.service(FacesServlet.java:321)

root cause

javax.el.PropertyNotFoundException: /pesquisafuncionario.xhtml @33,69 value="#{funcionarioBean.lista}": Property ‘lista’ not found on type br.com.jatendimento.bean.FuncionarioBean
com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:108)
javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:190)
javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:178)
javax.faces.component.UIData.getValue(UIData.java:554)
javax.faces.component.UIData.getDataModel(UIData.java:1278)
javax.faces.component.UIData.getRowCount(UIData.java:339)
org.primefaces.component.datatable.DataTableRenderer.encodeTbody(DataTableRenderer.java:401)
org.primefaces.component.datatable.DataTableRenderer.encodeMarkup(DataTableRenderer.java:164)
org.primefaces.component.datatable.DataTableRenderer.encodeEnd(DataTableRenderer.java:80)
javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:879)
javax.faces.component.UIComponent.encodeAll(UIComponent.java:1650)
javax.faces.render.Renderer.encodeChildren(Renderer.java:164)
javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:849)
javax.faces.component.UIComponent.encodeAll(UIComponent.java:1643)
javax.faces.component.UIComponent.encodeAll(UIComponent.java:1646)
com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:389)
com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:127)
com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:117)
com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97)
com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:135)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:309)


segue o meu codigo.

desde já obrigado.
Classe model Funcionario


package br.com.jatendimento.model;

import java.util.Date;

public class Funcionario {

	private int id;
	private String nome;
	private String email;
	private Date datacadastro;
	private String telefone;
	private String login;
	private String senha;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public Date getDatacadastro() {
		return datacadastro;
	}

	public void setDatacadastro(Date datacadastro) {
		this.datacadastro = datacadastro;
	}

	public String getTelefone() {
		return telefone;
	}

	public void setTelefone(String telefone) {
		this.telefone = telefone;
	}

	public String getLogin() {
		return login;
	}

	public void setLogin(String login) {
		this.login = login;
	}

	public String getSenha() {
		return senha;
	}

	public void setSenha(String senha) {
		this.senha = senha;
	}

}

FuncionarioBean


package br.com.jatendimento.bean;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import br.com.jatendimento.ConnectionFactory;
import br.com.jatendimento.model.Funcionario;

public class FuncionarioBean {

	Funcionario funcionario = new Funcionario();
	Connection con;

	public FuncionarioBean() {
		con = new ConnectionFactory().getConnection();
	}

public ArrayList<Funcionario> lista() throws SQLException {
		PreparedStatement stmt = con
				.prepareStatement("Select * from funcionario");
		ResultSet rs = stmt.executeQuery();
		ArrayList<Funcionario> funcionarios = new ArrayList<Funcionario>();
		while (rs.next()) {
			funcionario.setId(rs.getInt("idfuncionario"));
			funcionario.setNome(rs.getString("nomefuncionario"));
			funcionario.setEmail(rs.getString("email"));
			funcionario.setDatacadastro(rs.getDate("datacadastro"));
			funcionario.setTelefone(rs.getString("telefone"));
			funcionario.setLogin(rs.getString("login"));
			funcionario.setSenha(rs.getString("senha"));
		}
		rs.close();
		stmt.close();
		return funcionarios;
	}
                public Funcionario getFuncionario() {
                                return funcionario;
	}

	public void setFuncionario(Funcionario funcionario) {
		this.funcionario = funcionario;
	}

}

View


<!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:f="http://java.sun.com/jsf/core"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:p="http://primefaces.prime.com.tr/ui">
<h:head>
</h:head>
<body>
<center><h:form>
	<p:dataTable var="car" value="#{funcionarioBean.lista}" id="lista">
		<f:facet name="header">
           Funcionários
        </f:facet>
		<p:column headerText="Código" style="width:150px">
			<p:cellEditor>
				<f:facet name="output">
					<h:outputText value="#{funcionarioBean.funcionario.id}" />
				</f:facet>
				<f:facet name="input">
					<h:inputText value="#{funcionarioBean.funcionario.id}"
						style="width:100%" />
				</f:facet>
			</p:cellEditor>
		</p:column>
		<p:column headerText="Nome" style="width:150px">
			<p:cellEditor>
				<f:facet name="output">
					<h:outputText value="#{funcionarioBean.funcionario.nome}" />
				</f:facet>
				<f:facet name="input">
					<h:inputText value="#{funcionarioBean.funcionario.nome}"
						style="width:100%" />
				</f:facet>
			</p:cellEditor>
		</p:column>
		<p:column headerText="E-Mail" style="width:150px">
			<p:cellEditor>
				<f:facet name="output">
					<h:outputText value="#{funcionarioBean.funcionario.email}" />
				</f:facet>
				<f:facet name="input">
					<h:inputText value="#{funcionarioBean.funcionario.email}"
						style="width:100%" />
				</f:facet>
			</p:cellEditor>
		</p:column>
		<p:column headerText="Data de Cadastro" style="width:170px">
			<p:cellEditor>
				<f:facet name="output">
					<h:outputText value="#{funcionarioBean.funcionario.datacadastro}" />
				</f:facet>
				<f:facet name="input">
					<h:inputText value="#{funcionarioBean.funcionario.datacadastro}"
						style="width:100%" />
				</f:facet>
			</p:cellEditor>
		</p:column>
		<p:column headerText="Telefone" style="width:150px">
			<p:cellEditor>
				<f:facet name="output">
					<h:outputText value="#{funcionarioBean.funcionario.telefone}" />
				</f:facet>
				<f:facet name="input">
					<h:inputText value="#{funcionarioBean.funcionario.telefone}"
						style="width:100%" />
				</f:facet>
			</p:cellEditor>
		</p:column>
		<p:column headerText="Login" style="width:150px">
			<p:cellEditor>
				<f:facet name="output">
					<h:outputText value="#{funcionarioBean.funcionario.login}" />
				</f:facet>
				<f:facet name="input">
					<h:inputText value="#{funcionarioBean.funcionario.login}"
						style="width:100%" />
				</f:facet>
			</p:cellEditor>
		</p:column>
		<p:column headerText="Senha" style="width:150px">
			<p:cellEditor>
				<f:facet name="output">
					<h:outputText value="#{funcionarioBean.funcionario.senha}" />
				</f:facet>
				<f:facet name="input">
					<h:inputText value="#{funcionarioBean.funcionario.senha}"
						style="width:100%" />
				</f:facet>
			</p:cellEditor>
		</p:column>
		<p:column headerText="Opções">
			<p:rowEditor />
		</p:column>
	</p:dataTable>
</h:form></center>
</body>
</html>

Opa gustavo,
O erro está acontecendo porquê o JSF espera que o funcionarioBean possua um método chamado getLista().
Um managedbean trabalha sempre em cima das propriedades, ent~ão para que seu funcion’árioBean funcione da forma esperada voc^ê teria que criar uma propriedade lista dentro dele.

Sugestão:
você pode configurar o funcionarioBean como requestScoped e carregar a lista, cada vez que ele for criado.

PS: Não analisei o código de conexão com o banco nem o de montagem da tabela, vamos resolver a questão do managedBean primeiro para vermos essas outras coisas ok?

Opa Pedro obrigado por responder.
Certo fiz como falou, veja como ficou o bean.


package br.com.jatendimento.bean;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import javax.faces.bean.RequestScoped;

import br.com.jatendimento.ConnectionFactory;
import br.com.jatendimento.model.Funcionario;
@RequestScoped
public class FuncionarioBean {

	Funcionario funcionario = new Funcionario();
	Connection con;
	ArrayList<Funcionario> lista;
	public FuncionarioBean() {
		con = new ConnectionFactory().getConnection();
	
	}

public ArrayList<Funcionario> lista() throws SQLException {
		PreparedStatement stmt = con
				.prepareStatement("Select * from funcionario");
		ResultSet rs = stmt.executeQuery();
		ArrayList<Funcionario> funcionarios = new ArrayList<Funcionario>();
		while (rs.next()) {
			funcionario.setId(rs.getInt("idfuncionario"));
			funcionario.setNome(rs.getString("nomefuncionario"));
			funcionario.setEmail(rs.getString("email"));
			funcionario.setDatacadastro(rs.getDate("datacadastro"));
			funcionario.setTelefone(rs.getString("telefone"));
			funcionario.setLogin(rs.getString("login"));
			funcionario.setSenha(rs.getString("senha"));
		}
		rs.close();
		stmt.close();
		return funcionarios;
	}

                public Funcionario getFuncionario() {
		return funcionario;
	}

	public void setFuncionario(Funcionario funcionario) {
		this.funcionario = funcionario;
	}
	
	public ArrayList<Funcionario> getLista() {
		return lista;
	}

	public void setLista(ArrayList<Funcionario> lista) {
		this.lista = lista;
	}

}

Aproveitando para colocar a minha classe de conexão.

package br.com.jatendimento;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class ConnectionFactory {

	public Connection getConnection() {
		System.out.println("Conectando ao Banco");
		try {
			return DriverManager.getConnection(
					"jdbc:mysql://localhost/jatendimento", "root", "root");
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
}

o banco foi criado normalmente segue a tabela

CREATE TABLE funcionario (
idfuncionario int(11) NOT NULL auto_increment,
nomefuncionario varchar(100) NOT NULL,
email varchar(100) NOT NULL,
datacadastro date NOT NULL,
telefone varchar(13) default NULL,
login varchar(10) NOT NULL,
senha varchar(10) NOT NULL,
PRIMARY KEY (idfuncionario)
)

mais uma vez obrigado.

ah esqueci de mencionar, o erro a tabela foi construida porém nao trouxe nenhum resulado… fica com a mensagem “no records found”.

.

Gustavo,

Sua lista está vazia na sua implementação.

Vou comentar seu código ok?

package br.com.jatendimento.bean;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import javax.faces.bean.RequestScoped;

import br.com.jatendimento.ConnectionFactory;
import br.com.jatendimento.model.Funcionario;
@RequestScoped
public class FuncionarioBean {

	Funcionario funcionario = new Funcionario(); //Teoricamente você não precisa desse cara aqui.
	Connection con; //vamos por private aqui...
	ArrayList<Funcionario> lista; //esse cara é private também
	public FuncionarioBean() {
		con = new ConnectionFactory().getConnection();
                // aqui adicionamos isso:  lista = Collections.unmodifiableList(lista());
	
	}

/** Podemos fazer esse cara private ok? */
public ArrayList<Funcionario> lista() throws SQLException {

                 //Faltou o try cacth...e se der exception?
		PreparedStatement stmt = con
				.prepareStatement("Select * from funcionario");
		ResultSet rs = stmt.executeQuery();
		ArrayList<Funcionario> funcionarios = new ArrayList<Funcionario>();
		
                 while (rs.next()) {
                        // Aqui vc instancia o Funcionario.... Funcionario funcionario = new Funcionario()
			funcionario.setId(rs.getInt("idfuncionario"));
			funcionario.setNome(rs.getString("nomefuncionario"));
			funcionario.setEmail(rs.getString("email"));
			funcionario.setDatacadastro(rs.getDate("datacadastro"));
			funcionario.setTelefone(rs.getString("telefone"));
			funcionario.setLogin(rs.getString("login"));
			funcionario.setSenha(rs.getString("senha"));
                        // Aqui vc tem que adicionar seu funcionario na lista ok?
                        // funcionarios.add(funcionario);
		}
		rs.close();
		stmt.close(); // Você deve fazer isso em um finally
		return funcionarios;
	}

                public Funcionario getFuncionario() {
		return funcionario;
	}

	public void setFuncionario(Funcionario funcionario) {
		this.funcionario = funcionario;
	}
	
	public ArrayList<Funcionario> getLista() {
		return lista;
	}

	public void setLista(ArrayList<Funcionario> lista) {
		this.lista = lista;
	}

}

Outro ponto a sua tabela possui dados?

olá pedro eu trabalhei nisso durante a tarde e consegui resolver o problema de uma outra forma, mas mesmo assim muito obrigado pelas dicas do codigo, vai me ajudar a deixar a aplicação ainda melhor… muito obrigado de verdade pela atenção!

Pode haver pessoas passando pelo mesmo problema. Dói muito o pessoal dizer como resolveu? Os dedos não vão cair!