Problema com DataTable PrimeFaces JSF

7 respostas
G

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>

7 Respostas

PedroTOliveira

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?

G

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.

G

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

G

.

PedroTOliveira

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?

G

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!

jSze

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

Criado 30 de dezembro de 2010
Ultima resposta 3 de set. de 2013
Respostas 7
Participantes 3