[RESOLVIDO] setPropertyActionListener

17 respostas
Ace

Boa tarde.
Pessoal, estou com um problema, onde o mesmo não me gera erro nenhum. ele simplesmente não estah populando partes de meu formulario.

Tenho 2 tabelas relacionadas, Produto e Autor:

  • Para inserir os dados ele insere normalmente, tanto produto qto o autor
  • Porem ao clicar no link para alterar ele popula os dados do produto, e os dados do autor vem nulos. :?

MB

@ViewScoped
@ManagedBean
public class ProdutoBean {
	
	private Produto produto = new Produto();
	private List<Produto> produtos;
	private Autor autor = new Autor();
	
	//se o id for nulo então salva, se não, atualiza
	public void grava(){
		Dao<Produto> dao = new Dao<Produto>(Produto.class);
		if(produto.getId() == null){
			produto.setAutor(autor);
			dao.salva(produto);			
		}else{
			dao.atualiza(produto);
		}
		this.autor = new Autor();
		this.produto = new Produto();		
		this.produtos = dao.listaTudo();
	}	

        //getter setter

XHTML

<h:form id="formLista">
				<p:dataTable value="#{produtoBean.produtos}" var="p" paginator="true" rows="5">
					<p:column headerText="ISBN">
						#{p.code}
					</p:column>
					<p:column headerText="Titulo">
						#{p.titulo}
					</p:column>
					<p:column headerText="Genero">
						#{p.genero}
					</p:column>
					<p:column headerText="Preco">
						<h:outputText value="#{p.preco}">
							<f:convertNumber pattern="R$ #0.00" />
						</h:outputText>
					</p:column>
					<p:column headerText="Peso">
						#{p.peso}
					</p:column>					 
					<p:column headerText="Autor">
						#{p.autor.nome}
					</p:column>
					<p:column headerText="Sobre">	
						<h:outputText value="#{p.autor.sobre}" escape="false" />																																					
					</p:column>
					<p:column headerText="Acoes" >						
						<h:commandLink value="Alterar">
							<f:setPropertyActionListener value="#{p}" target="#{produtoBean.produto}">
								<f:ajax execute="@form" render="@form :formAdicao" />
							</f:setPropertyActionListener>
						</h:commandLink>
					</p:column>
					<p:column headerText="Acoes">
						<h:commandLink action="#{produtoBean.remove(p)}" value="remover">
							<f:ajax render="@form" />
						</h:commandLink>
					</p:column>					
				</p:dataTable>
			</h:form>

Alguma ideia?

Vlw fico no aguardo.

17 Respostas

caio.gaspar

Pergunta:
Você viu se está vindo do banco os dados do autor???

Ace

Caio, esta sim cara, pois após ser inserido ele jah me lista na tela…

caio.gaspar

mostra como está a tela para alterar o produto e autor…

Ace

A segunda aba q seriam os dados do autor estão nulas…

caio.gaspar

Cara aqui não da para visualizar a imagem… posta o codigo aqui…

Ace

MB

@ViewScoped
@ManagedBean
public class ProdutoBean {
	
	private Produto produto = new Produto();
	private List<Produto> produtos;
	private Autor autor = new Autor();
	
	//se o id for nulo então salva, se não, atualiza
	public void grava(){
		Dao<Produto> dao = new Dao<Produto>(Produto.class);
		if(produto.getId() == null){
			produto.setAutor(autor);
			dao.salva(produto);			
		}else{
			dao.atualiza(produto);
		}
		this.autor = new Autor();
		this.produto = new Produto();		
		this.produtos = dao.listaTudo();
	}	

	public List<Produto> getProdutos() {
		if(produtos == null){
		produtos = new Dao<Produto>(Produto.class).listaTudo();
	}
		return produtos;
		}	
	
	public void remove(Produto p){
		Dao<Produto> dao = new Dao<Produto>(Produto.class);
		dao.deleta(p);
		this.produtos = dao.listaTudo();
	}
	
	public void cancelaEdicao(){
		this.produto = new Produto();
	}
	
	
	/**
	 * 
	 * Getter's & Setter's
	 */
	
	public Produto getProduto() {
		return produto;
	}	

	public void setProduto(Produto produto) {
		this.produto = produto;
	}	

	public Autor getAutor() {
		return autor;
	}

	public void setAutor(Autor autor) {
		this.autor = autor;
	}

	
		

}

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:f="http://java.sun.com/jsf/core"
		xmlns:h="http://java.sun.com/jsf/html"
		xmlns:ui="http://java.sun.com/jsf/facelets"
		xmlns:p="http://primefaces.prime.com.tr/ui">
	
	
	<ui:composition template="/_template.xhtml">
		<ui:define name="corpo">
		
		<h2>Adiciona Produtos</h2>
			  
			<h:form id="formAdicao">
				<p:tabView>
					<p:tab title="Dados do Produto">
						<fieldset>
							<legend>Dados do Produto</legend>
							<h:outputLabel value="ISBN:" for="code" />
							<p:inputText value="#{produtoBean.produto.code}" id="code" />					
							
							<h:outputLabel value="Titulo:" for="titulo" />
							<p:inputText value="#{produtoBean.produto.titulo}" id="titulo" />
							
							<h:outputLabel value="Genero:" for="genero" />
							<p:inputText value="#{produtoBean.produto.genero}" id="genero" />
							
							<h:outputLabel value="Preco:" for="preco" />
							<p:inputText value="#{produtoBean.produto.preco}" id="preco" />
							
							<h:outputLabel value="Peso:" for="peso" />
							<p:inputText value="#{produtoBean.produto.peso}" id="peso" />										
							
							<h:commandButton value="Cancelar" action="#{produtoBean.cancelaEdicao}" rendered="#{produtoBean.produto.id != null}">
								<f:ajax render="@form" />
							</h:commandButton>
						</fieldset>
					</p:tab>
					
					<p:tab title="Dados do Autor">
						<fieldset>
							<legend>Dados do Autor</legend>
							<h:outputLabel value="Nome:" for="nome" />
							<p:inputText value="#{produtoBean.autor.nome}" id="nome" />
							
							<h:outputLabel value="Sobre:" for="sobre" />
							<p:editor value="#{produtoBean.autor.sobre}" id="sobre" />
							
							<h:commandButton action="#{produtoBean.grava}" value="Gravar" />
						</fieldset>	
					</p:tab>
					
				</p:tabView>					
			</h:form>
		
			
			<h2>Listagem</h2>
		
			<h:form id="formLista">
				<p:dataTable value="#{produtoBean.produtos}" var="p" paginator="true" rows="5">
					<p:column headerText="ISBN">
						#{p.code}
					</p:column>
					<p:column headerText="Titulo">
						#{p.titulo}
					</p:column>
					<p:column headerText="Genero">
						#{p.genero}
					</p:column>
					<p:column headerText="Preco">
						<h:outputText value="#{p.preco}">
							<f:convertNumber pattern="R$ #0.00" />
						</h:outputText>
					</p:column>
					<p:column headerText="Peso">
						#{p.peso}
					</p:column>					 
					<p:column headerText="Autor">
						#{p.autor.nome}
					</p:column>
					<p:column headerText="Sobre">	
						<h:outputText value="#{p.autor.sobre}" escape="false" />																																					
					</p:column>
					<p:column headerText="Acoes" >						
						<h:commandLink value="Alterar">
							<f:setPropertyActionListener value="#{p}" target="#{produtoBean.produto}">
								<f:ajax execute="@form" render="@form :formAdicao" />
							</f:setPropertyActionListener>
						</h:commandLink>
					</p:column>
					<p:column headerText="Acoes">
						<h:commandLink action="#{produtoBean.remove(p)}" value="remover">
							<f:ajax render="@form" />
						</h:commandLink>
					</p:column>					
				</p:dataTable>
			</h:form>			
		</ui:define>
	</ui:composition>	
</html>

Autor

package br.com.loja.modelo;


import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;


@Entity
public class Autor {
	
	@Id
	@GeneratedValue
	private Long id;
	
	private String nome;
	private String foto;
	private String sobre;		
	
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getFoto() {
		return foto;
	}
	public void setFoto(String foto) {
		this.foto = foto;
	}
	public String getSobre() {
		return sobre;
	}
	public void setSobre(String sobre) {
		this.sobre = sobre;
	}	
	

}

Produto

package br.com.loja.modelo;



import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;


@Entity
public class Produto {

	@Id
	@GeneratedValue	
	private Long id;
	private Long code;
	
	private Double preco;
	private Double peso;
	
	private String titulo;
	private String genero;
	private String tipo;
	private String img;	

	@ManyToOne(cascade = CascadeType.ALL)
	private Autor autor;	
		
	
	public Autor getAutor() {
		return autor;
	}
	public void setAutor(Autor autor) {
		this.autor = autor;
	}
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public Long getCode() {
		return code;
	}
	public void setCode(Long code) {
		this.code = code;
	}
	public Double getPreco() {
		return preco;
	}
	public void setPreco(Double preco) {
		this.preco = preco;
	}
	public Double getPeso() {
		return peso;
	}
	public void setPeso(Double peso) {
		this.peso = peso;
	}
	public String getTitulo() {
		return titulo;
	}
	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}
	public String getGenero() {
		return genero;
	}
	public void setGenero(String genero) {
		this.genero = genero;
	}
	public String getTipo() {
		return tipo;
	}
	public void setTipo(String tipo) {
		this.tipo = tipo;
	}
	public String getImg() {
		return img;
	}
	public void setImg(String img) {
		this.img = img;
	}

}
caio.gaspar

Bom dei uma olhada no teu código e vi que no formulário de adição voce separa o produto e autor e na ação de alterar você passa somente o produto. por isso que não aparece os dados do autor.

Ace

Certo, qual sua sugestão para isso? como posso passar esse parametro?

caio.gaspar

Tenta utilizar no form de adição os objetos juntos, já que o produto tem um autor.
Exemplo

#{produtoMBean.produto.autor.nome}

dai quando voce for alterar, não será necessário passar mais de um objeto somente o produto com o autor já setado.

Ace

No meu formAdição alterei de:

<p:inputText value="#{produtoBean.autor.nome}" id="nome" />

Para:

<p:inputText value="#{produtoBean.produto.autor.nome}" id="nome" />
type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: /produto.xhtml @45,75 value="#{produtoBean.produto.autor.nome}": Target Unreachable, 'autor' returned null
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:325)

root cause

javax.el.PropertyNotFoundException: /produto.xhtml @45,75 value="#{produtoBean.produto.autor.nome}": Target Unreachable, 'autor' returned null
	com.sun.faces.facelets.el.TagValueExpression.getType(TagValueExpression.java:100)
	org.primefaces.component.inputtext.InputTextRenderer.getConvertedValue(InputTextRenderer.java:113)
	javax.faces.component.UIInput.getConvertedValue(UIInput.java:1028)
	javax.faces.component.UIInput.validate(UIInput.java:958)
	javax.faces.component.UIInput.executeValidate(UIInput.java:1209)
	javax.faces.component.UIInput.processValidators(UIInput.java:698)
	javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1085)
	javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1085)
	org.primefaces.component.tabview.TabView.processValidators(TabView.java:250)
	javax.faces.component.UIForm.processValidators(UIForm.java:244)
	javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1085)
	javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1085)
	javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:1165)
	com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:76)
	com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:312)
caio.gaspar

Você inicializou o atributo Autor do objeto Produto???

lá no construtor do Mb você precisa inicilizar os objetos que vão ser setados na view.

Exemplo:

this.produto.setAutor(new Autor());
Ace

Mesmo erro ! :?

caio.gaspar

como que ficou o MB e o view???

Pergunta:
o erro acontece quando??? quando voce salva?? quando você clica no botao para alterar?? quando abre a página??

Ace

Alterei meu MB no metodo de grava para

//se o id for nulo então salva, se não, atualiza
	public void grava(){
		Dao<Produto> dao = new Dao<Produto>(Produto.class);
		if(produto.getId() == null){
			this.produto.setAutor(new Autor());  <-----------
			dao.salva(produto);			
		}else{
			dao.atualiza(produto);
		}
		this.autor = new Autor();
		this.produto = new Produto();		
		this.produtos = dao.listaTudo();
	}

View

<h:form id="formAdicao">
				<p:tabView>
					<p:tab title="Dados do Produto">
						<fieldset>
							<legend>Dados do Produto</legend>
							<h:outputLabel value="ISBN:" for="code" />
							<p:inputText value="#{produtoBean.produto.code}" id="code" />					
							
							<h:outputLabel value="Titulo:" for="titulo" />
							<p:inputText value="#{produtoBean.produto.titulo}" id="titulo" />
							
							<h:outputLabel value="Genero:" for="genero" />
							<p:inputText value="#{produtoBean.produto.genero}" id="genero" />
							
							<h:outputLabel value="Preco:" for="preco" />
							<p:inputText value="#{produtoBean.produto.preco}" id="preco" />
							
							<h:outputLabel value="Peso:" for="peso" />
							<p:inputText value="#{produtoBean.produto.peso}" id="peso" />										
							
							<h:commandButton value="Cancelar" action="#{produtoBean.cancelaEdicao}" rendered="#{produtoBean.produto.id != null}">
								<f:ajax render="@form" />
							</h:commandButton>
						</fieldset>
					</p:tab>
					
					<p:tab title="Dados do Autor">
						<fieldset>
							<legend>Dados do Autor</legend>
							<h:outputLabel value="Nome:" for="nome" />
							<p:inputText value="#{produtoBean.produto.autor.nome}" id="nome" />
							
							<h:outputLabel value="Sobre:" for="sobre" />
							<p:editor value="#{produtoBean.produto.autor.sobre}" id="sobre" /> <!-- Alterado aki -->
							
							<h:commandButton action="#{produtoBean.grava}" value="Gravar" /> <!-- Alterado aki -->
						</fieldset>	
					</p:tab>
					
				</p:tabView>					
			</h:form>

Desta forma, ele me da erro ao inserir o produto…porém ele me carrega a pagina

caio.gaspar

Amigo,

tenta fazer o teu MB assim.

eu criei um construtor para o MB e lá eu inicializo os objetos.

detalhe: eu retirei uma linha do metodo salvar. Nessa linha você estava setando o objeto autor no produto. não é mais necessário.

Segue o MB:

@ViewScoped
@ManagedBean
public class ProdutoBean {
	
	private Produto produto;
	private List<Produto> produtos;
	private Autor autor;

// Construtor do MB 
public ProdutoBean(){
//Inicializando objeto produto
this.produto = new Produto();
//Inicializando objeto autor do produto
this.produto.setAutor(new Autor());  <------------

}

	//Esse metodo continua o mesmo
	//se o id for nulo então salva, se não, atualiza
	public void grava(){
		Dao<Produto> dao = new Dao<Produto>(Produto.class);
		if(produto.getId() == null){
			dao.salva(produto);			
		}else{
			dao.atualiza(produto);
		}
		this.autor = new Autor();
		this.produto = new Produto();		
		this.produtos = dao.listaTudo();
	}	

	public List<Produto> getProdutos() {
		if(produtos == null){
		produtos = new Dao<Produto>(Produto.class).listaTudo();
	}
		return produtos;
		}	
	
	public void remove(Produto p){
		Dao<Produto> dao = new Dao<Produto>(Produto.class);
		dao.deleta(p);
		this.produtos = dao.listaTudo();
	}
	
	public void cancelaEdicao(){
		this.produto = new Produto();
	}
	
	
	/**
	 * 
	 * Getter's & Setter's
	 */
	
	public Produto getProduto() {
		return produto;
	}	

	public void setProduto(Produto produto) {
		this.produto = produto;
	}	

	public Autor getAutor() {
		return autor;
	}

	public void setAutor(Autor autor) {
		this.autor = autor;
	}

	
		

}
Ace

Brother muito obrigado, pela paciencia…

Nem tinha passado pela minha cabeça em criar o construtor para meu Bean.
mas eh isso ai programando e aprendendo…!

Vlw man…

:smiley:

Ace

Fico meio confuso com esses construtores, quando devemos utilizalos e tal…

Criado 24 de agosto de 2011
Ultima resposta 24 de ago. de 2011
Respostas 17
Participantes 2