Urgente - ERRO JSF

42 respostas
E

Pessoal ao acionar meu comandlink o JSF reporta o seguinte erro

javax.el.PropertyNotFoundException: /cadastroCliente.xhtml @81,23 value="#{mbCliente.cliente.nome}": Target Unreachable, 'cliente' returned null

Ja, fucei tudo e não achei uma solução , gostaria da ajuda de você

MEU XHTML

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<!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:h="http://java.sun.com/jsf/html"
	xmlns:p="http://primefaces.prime.com.tr/ui"
	xmlns:f="http://java.sun.com/jsf/core">
<h:head>
	<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
	<title>Cadastro de Clientes</title>
</h:head>
<h:body>
	<h:form id="frmCliente">
	<p:messages/>
		<p:dataTable widgetVar="dtClientes"
					 var="cliente" 
					 value="#{mbCliente.clientes}" 
					 paginator="true"
					 rows="10" 
					 selection="#{mbCliente.cliente}" 
					 selectionMode="single"
			         onRowSelectUpdate="display" 
			         onRowSelectComplete="dlgCliente.show()"
			         style="width:70%">
	 		<p:column sortBy="#{cliente.id}" 
			          filterBy="#{cliente.id}"
			          style="width:20%">
				<f:facet name="header">
					<h:outputText value="Id" />
				</f:facet>
			</p:column>
	 		<p:column sortBy="#{cliente.nome}" 
			          filterBy="#{cliente.nome}">
				<f:facet name="header">
					<h:outputText value="Nome" />
				</f:facet>
			</p:column>
	 		<p:column sortBy="#{cliente.cnpj}" 
			          filterBy="#{cliente.cnpj}">
				<f:facet name="header">
					<h:outputText value="Cnpj" />
				</f:facet>
			</p:column>
		</p:dataTable>
		<p:panel style="width:69.2%">
			<h:commandLink title="Novo" // AO CLICAR REPORTA O ERRO JA TROQUEI DE JSF (h:commandLink ) para Prime(p:commandLink ) mais nada
			               oncomplete="dlgCliente.show();">
				<h:graphicImage url="/imagens/novo.jpg"
								style="border:0"/>
			</h:commandLink>
			<p:commandLink title="Apagar"
			               action="#{mbCliente.apagar}"
			               style="margin-left:20px"
			               update="dtClientes">
				<h:graphicImage url="/imagens/apagar.jpg"
								style="border:0"/>
			</p:commandLink>
			<p:commandLink title="Voltar"
			               action="#{mbCliente.voltar}"
			               ajax="false"
			               style="margin-left:20px">
				<h:graphicImage url="/imagens/voltar.jpg"
								style="border:0"/>
			</p:commandLink>
		</p:panel>
		<p:dialog id="dlgCliente"
				  widgetVar="dlgCliente"
		          header="Cliente"
				  showEffect="bounce" 
				  width="500">
		    <p:messages/>
			<h:panelGrid columns="2">
				<h:outputLabel value="Id" 
		   		   	           for="itxId" />
				<h:inputText id="itxId"
						     value="#{mbCliente.cliente.id}" 
						     disabled="true"/>
				<h:outputLabel value="Nome" 
		   		   	           for="itxNome" />
				<h:inputText id="itxNome"
						     value="#{mbCliente.cliente.nome}" 
						     size="35"/>
				<h:outputLabel value="CNPJ" 
		   		   	           for="itxCnpj" />
				<h:inputText id="itxCnpj"
						     value="#{mbCliente.cliente.cnpj}"/>
			</h:panelGrid>
			<h:panelGrid columns="3">
					<p:commandLink title="Gravar"
				                   action="#{mbCliente.gravar}"
				                   rendered="#{empty mbCliente.cliente.id}"
				                   update="dtClientes"
				                   ajax="false">
					<h:graphicImage url="/imagens/gravar.jpg"
									style="border:0"/>
					</p:commandLink>
					<p:commandLink title="Alterar"
				                   actionListener="#{mbCliente.alterar}"
				                   rendered="#{!empty mbCliente.cliente.id}"
				                   update="dtClientes">
					<h:graphicImage url="/imagens/alterar.jpg"
									style="border:0"/>
					</p:commandLink>
			</h:panelGrid>
		</p:dialog>
	</h:form>
</h:body>
</html>

meu MBCliente

package controladores;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ActionEvent;

import negocios.ClienteBO;
import entidades.Cliente;

@ManagedBean(name="mbCliente")
@ViewScoped
public class MBCliente implements Serializable {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 4718957167100835066L;
	private ClienteBO clienteBO;
	private Cliente cliente;
	private List<Cliente> clientes;
		
	public MBCliente(){
		this.setClienteBO(new ClienteBO());
		this.setCliente(new Cliente());
		this.setClientes(new ArrayList<Cliente>());
	}

	public ClienteBO getClienteBO() {
		return clienteBO;
	}

	public void setClienteBO(ClienteBO clienteBO) {
		this.clienteBO = clienteBO;
	}

	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	public List<Cliente> getClientes() {
		return clientes;
	}

	public void setClientes(List<Cliente> clientes) {
		this.clientes = clientes;
	}
	
	public void gravar(){
		try {
			this.getClienteBO().gravar(this.getCliente());
			this.getClientes().add(this.getCliente());
			this.setCliente(new Cliente());
			JSFUtil.enviarMenssagemSucesso("Cliente gravado com sucesso");
		} catch (Exception e) {
			JSFUtil.enviarMenssagemErro("Erro ao gravar"+" "+e.getMessage() );
		}
	}
	
	public void alterar(ActionEvent evento) {
		try {
			this.getClienteBO().gravar(this.getCliente());
			this.getClientes().remove(this.getCliente());
			this.getClientes().add(this.getCliente());
			JSFUtil.enviarMenssagemSucesso("Cliente alterado com sucesso");
		} catch (Exception e) {
			JSFUtil.enviarMenssagemErro("Erro ao alterar"+" "+e.getMessage() );
		}
	}

	public void apagar() {
		try {
			this.getClienteBO().gravar(this.getCliente());
			this.getClientes().remove(this.getCliente());
			JSFUtil.enviarMenssagemSucesso("Cliente apagado com sucesso");
		} catch (Exception e) {
			JSFUtil.enviarMenssagemErro("Erro ao apagar"+" "+e.getMessage() );
		}
	}
	
	public List<Cliente> listar(){ 
		List<Cliente> clientes = new ArrayList<Cliente>();
		try {
			clientes = this.getClienteBO().listar();
		} catch (Exception e) {
			JSFUtil.enviarMenssagemErro("Erro ao Listar"+" "+e.getMessage() );
		}
		return clientes;
	}
			
	
	public String voltar(){
		return "index";
	}
}

minha Classe Cliente

package entidades;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Table(name="Cliente")
@Entity
public class Cliente implements Serializable{
	
	private static final long serialVersionUID = -3385161602869622711L;
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name="id", nullable=false) 
	private Integer id;
	@Column(name="nome", nullable=false)
	private String nome;
	@Column(name="cnpj", nullable=false)
	private String cnpj;
	
	public Cliente(){
		
	}
	
	public Integer getId() {
		return id;
	}

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

	public String getNome() {
		return nome;
	}

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

	public String getCnpj() {
		return cnpj;
	}

	public void setCnpj(String cnpj) {
		this.cnpj = cnpj;
	}
	
	
	
}

Não indendo este erro..

Deste ja agradeço

Ja tentei fazer Cliente cliente = new Cliente(); nada tambem

Obrigado

42 Respostas

R

Tenta tirar o private

elton.souza

Para qual action a tua classe está indo quando clica no botão Novo?

E

Obrigado pela dica, porem o JSF acessa o atributos pelos seus respectivos get e set PUBLICOS…

Pessoal, da uma força ai.

E

elton.souza nenhum action…

ele apenas abre o dialog para poder inserir um cliente,

depois no dialog existe o botao gravar, este sim aciona o metodo gravar no bean

E

outro ponto a resaltar e seu emu botao novo for do prime, se torna um requisicao ajax, assim ele nao faz o submit e não gera este erro.

Porem eu preciso que seja h:comandlink e nao p:comandlink por outra questao

lazaropj

Kd o get e set do seu Cliente no seu ManagedBean?
Será q ele tá pegando?

elton.souza

<h:commandLink title="Novo" // AO CLICAR REPORTA O ERRO JA TROQUEI DE JSF (h:commandLink ) para Prime(p:commandLink ) mais nada oncomplete="dlgCliente.show();"> <h:graphicImage url="/imagens/novo.jpg" style="border:0"/> </h:commandLink>

Troca o h:commandLink pelo h:outputLink, como abaixo:

<h:outputLink title="Novo" value="javascript:dlgCliente.show();"> <h:graphicImage url="/imagens/novo.jpg" style="border:0"/> </h:outputLink>

luxu

Bom eu aprendi a instanciar o objeto naum no costrutor e sim na propriedade…

private Cliente cliente = new Cliente();

funcionou e nunca mais deu esse erro ae…

E

Não tem nada vem instaciar no construtor ou não.
O construtor é exatamente para isso. para iniciar alguma coisa que queira

E

lazaropj
está no código acima observa que vc acha. então cara eu acho que ele esta pegando.

só que não porque ele fala que op cliente esta nulo…

E

elton.souza
isso tambem no meu ponto de vista não teria importancia mais teste e continua o mesmo erro

Pessoa grato por estar ajudando

E

Alguem mais?

Flavio_machine

Como o managed-bean foi declarado no seu faces config ?

Flavio_machine

Instancia no construtor.

L

Qual o escopo do seu bean?

E

ja estou instaciando no contrutor;;;;

Verifica a anotação encima do MBCliente -

esta como View mais ja testei como sessao tambem

adriano_si

o luxu pediu pra vc instanciar fora do Construtor…

Por não conhecer como seu JSF está configurado, não sei em que momento seu construtor é chamado… Logo Cliente pode nunca ter sido iniciado…

Tenta tirar do construtor e colocar a inicialização do teu Cliente direto na declaração do teu atributo cliente; Faz pelo menos pra testar…

Abs []

E

Ja tentei isso, ja fiz este teste.
O construtor é chamado com certeza. até porque se não fosse chamado ia dar erro em um monte de coisa.

Como por exemplo a lista de clientes que instâncio no construtor

Enfim ja fiz esse teste

Continuo esperando contribuição

Obrigado adriano_si e a toda galera

Flavio_machine

O resto da sua aplicação funciona direito ?

E

Então comecei fazer, por enquanto só tem isso…

Existo outro cadastro que está feito do mesmo jeito e tambem gera o mesmo erro

God_of_Java

Troque este seu design loco de setar variaveis no construtor que sequer foram inicializadas

public MBCliente(){ this.setClienteBO(new ClienteBO()); this.setCliente(new Cliente()); this.setClientes(new ArrayList&lt;Cliente&gt;()); }

public MBCliente(){  
         this.clienteBO = new   ClienteBO();
         this.cliente = new Cliente();  
         this.clientes= new ArrayList&lt;Cliente&gt;();  
     }
E

"design loco " rsrs porque? o construtor é pra isso !

Fiz o teste - continua o mesmo erro.

Obrigado God_of_Java

Flavio_machine

Tenta instanciar o managed-bean pelo faces config, fica mais ou menos assim, tira a anotação do managed bean.

<managed-bean>

<managed-bean-name>controllerSessao</managed-bean-name>

<managed-bean-class>br.com.totalsat.jsf.controller.ControllerSessao</managed-bean-class>

<managed-bean-scope>session</managed-bean-scope>

</managed-bean>

Faz um teste sem primefaces só com um campo e em botão para isolar o erro

God_of_Java

Como vc esta fazendo as chamadas ao EJB, via lookup ou injeção de dependencia?

E

Assim tambem não funcionou

Olha o que eu pude perceber que se eu tirar os inputText dentro do dialog e deixar só o restante funciona.

o problema é quanto eu acesso o cliente, fala que esta nulo…

Mais como vocês pode observar. não tahh

tirei tudo do prime e mudei para h: (jsf) CONTINUA…se dar submit ele fala que o cliente ta nulo

E

Não estou usando EJB… Estou usando apenas JPA(Hibernate) + JSF, assim não uso nenhum desses recursos

leonardoMachado

Se vc colocar um breakpoint no método setCliente, irá ver que em determinada fase do ciclo de vida do JSF ele atribui null para a variável cliente. Para resolver isso faça assim e veja se funciona:

public void setCliente(Cliente c)
    if(c !=null) {
        this.c = c;
    }

Ou algo parecido…
Isso acontece usando o primefaces e também não sei o motivo dele setar null em algumas propriedades…

God_of_Java

Adiciona a action no commandLink

&lt;h:commandLink title="Novo" action="#{mbCliente.novo}" oncomplete="dlgCliente.show();"&gt; &lt;h:graphicImage url="/imagens/novo.jpg" style="border:0"/&gt; &lt;/h:commandLink&gt;

No mb cria o metodo …

public void novo(){
  this.cliente = new Cliente();
}

Assim vc garante que o cliente não será nulo…

E

cara fiz isso no set e teste tambem no get e por incrivel que pareça não funciono.

e tambem isso ia ficar muito gambiarra ia bagunça muito a aplicação

teria outra solução?

será que aglum tipo de bug?

obrigado leonardoMachado

leonardoMachado

Não conheço outra solução, e não considero gambiarra isso, a menos que vc mostre uma forma mais elegante de fazer isso…

God_of_Java

Faz o que eu falei adciona a action e o metodo…

E

God_of_Java
quando postei não tinha este metodo , porem ja implementei ah algum tempo. eu observei que ele não chega chamar o metodo, a exceção e gerada antes

E

leonardoMachado

muitas vezes eu preciso do cliente preenchido para poder alterar, quando eu for alterar um cliente o set resolver da new no cliente… os campos vai ficar tudo zerado, ai vai ficar impossivel de fazer a alteração.

Enfim isto não vem muito ao caso agora, a questão é que mesmo daquele jeito não funciono

Obrigado

adriano_si

bom… confesso que agora que olhei para a sua página, isso porque odeio Tags… heuheueheueheuehu

Pois bem… o que é pra acontecer quando clicar em Novo ??? É pra renderizar alguma página nova ?? Vai renderizar a própria página postada em alguma outra área ??? Que parte do meu MBean é chamada qaundo você clica nesse botão ??

Abs []

E

A ideia é quando eu clicar em novo abrir um dialog com os campos do cliente para realizar o cadastro somente isto mais nada.

não ah necessidade de renderizar nada a não ser o proprio dialog, por enquanto eu adicionei um metodo chamado novo no meu bean Cliente (MBCliente)que é chamado no action do novo, este metodo apenas faz isto

public void novo(){
	// não chega aqui
	this.setCliente(new Cliente());
	System.out.println("novo");
}

serve para zerar o cliente, realizar o cadastro
porem a exceção e gerada antes

E

Alguem mais alguma ideia?

E

Pessoal descobri que se eu colocar o dialog em form separado ele não gera o erro e entra no metodo novo, porem o dialog não abre

adriano_si

Cara… já procuraste nos bug reports do Prime pra saber se não é um erro do componente em si ???

Estranho mesmo, podes ter encontrado um Bug real, de repente está postada alguma coisa lá… enfim… só verificando mesmo…

Você implementou o componente igual ao exemplo passado por eles ??

Abs []

E

Então tambem tinha pensado nisto, porem tirei o dialog para testar e o erro permanece…

E

PESSOALL ATÉ QUE fim descobri, depois de dias hauhaua

nossa perdi horas nisso

é o seguinte para não da aquele erro de objeto(cliente) nulo, eu tenho que colocar dois forms um na datatable e um nos input(dentro do dialog) (não sei porque gostaria de saber =S)

porem feito isso a função show do dialog não funciona, Mais isso é para o IE, ja no Mozilla e função show funciona.

temos um pequeno bug do dialog para o IE…

Bom , consegui com ajuda de vocês…

Quero agradecer a contribuição de todos.

Obrigadooo

adriano_si

Pow cara bacana… Essa é a idéia, pedir ajuda e ir correndo por fora… Bacana mesmo…

Coloque só o RESOLVIDO no título do seu Tópico…

Abs[] e sucesso na empreitada…

E

Pessoal, tem outra coisaa… os dados do input não esta sendo passado para o MB, grava só o id, acho que se relaciona por ter dois forms

pois fiz um teste sem o dialog com um form e funcionou…

alguem?

Criado 28 de fevereiro de 2011
Ultima resposta 1 de mar. de 2011
Respostas 42
Participantes 10