[RESOLVIDO] setPropertyActionListener

17 respostas
A

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

C

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

A

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

C

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

A

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

C

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

A

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;
	}

}
C

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.

A

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

C

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.

A

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)
C

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());
A

Mesmo erro ! :?

C

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??

A

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

C

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;
	}

	
		

}
A

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:

A

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