Prime Faces + ActionListener do commandbutton não invoca metodo Bean :$[RESOLVIDO]

23 respostas
F

Oláaa Pessoal , Estou desenvolvendo um CRUD utilizando prime faces para aprendizado … fiz toda a parte DAO e Controle e agora fui para o formularios e me deparei com este problema:

clico no botão cadastra nada acontece , não chama o meu metodo bean pode me ajudar .

XHTML

<h:form id="FrmNovoCliente">
            <p:dialog header="Novo Cliente " widgetVar="ClienteDialog" resizable="false" id="ClienteDialog" modal="true">  
                <p:growl id="growl" showDetail="true" sticky="true" />  
                <h:panelGrid id="display" columns="3" cellpadding="8" style="margin:0 auto;">  


                    <h:outputText value="Nome :"/>  
                    <h:outputText value="Idade:"/>  
                    <h:outputText value="Sexo:" />  
                    <p:inputText value="#{clienteBean.cliente.nome}" style="width: 250px;"/>
                    <p:inputText value="#{clienteBean.cliente.idade}" style="width: 25px;"/>
                    <p:selectOneMenu value="#{clienteBean.cliente.sexo}">  
                        <f:selectItem itemLabel="Selecione" itemValue="" />  
                        <f:selectItem itemLabel="Masculino" itemValue="Masculino" />  
                        <f:selectItem itemLabel="Feminino" itemValue="Feminino" />  

                    </p:selectOneMenu>  

                    <h:outputText value="RG:" />  
                    <h:outputText value="Telefone:" />  
                    <h:outputText value="Endereço:" />  
                    <p:inputText value="#{clienteBean.cliente.rg}" style="width: 250px;"/>
                    <p:inputText value="#{clienteBean.cliente.fone}" style="width: 250px;"/>
                    <p:inputText value="#{clienteBean.cliente.end}" style="width: 250px; text-align: left;"/>
                </h:panelGrid>  

                <p:separator/>
                <p:commandButton   value="Salvar"   update=":FrmClientes"   actionListener="#{clienteBean.inserirCliente(actionEvent)}"   oncomplete="ClienteDialog.hide()"  image="" />
                <p:commandButton   value="Cancelar" update=":FrmClientes" oncomplete="ClienteDialog.hide()"  image="" />  
            </p:dialog>  

        </h:form>

23 Respostas

F

Classe Bean

import javax.inject.Named;
import javax.enterprise.context.SessionScoped;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;


/**
 *
 * @author f.aquino
 */
@Named(value = "clienteBean")
@ViewScoped
@SessionScoped
@ManagedBean
public class ClienteBean implements Serializable {

    private Cadcliente Cliente;
    private List<Cadcliente> Clientes;

    public ClienteBean() {
        Cliente = new Cadcliente();

    }


    public void InserirCliente(ActionEvent actionEvent) {
        FacesContext context = FacesContext.getCurrentInstance();
       CadClienteDAO ClienteDao = new CadCLienteImpl();
            ClienteDao.Inserir(Cliente);
            context.addMessage(null, new FacesMessage("Cadastro Concluido com Sucesso !"));
   


    }
V

Altere aqui:

<p:commandButton   value="Salvar"   update=":FrmClientes"   actionListener="#{clienteBean.inserirCliente()}"

E deixe a classe assim:

@ViewScoped  
@SessionScoped  
@ManagedBean (name="clienteBean") 
public class ClienteBean implements Serializable {  
  
    private Cadcliente Cliente;  
    private List<Cadcliente> Clientes;  
  
    public ClienteBean() {  
        Cliente = new Cadcliente();  
  
    }  
  
  
    public void InserirCliente() {  
        FacesContext context = FacesContext.getCurrentInstance();  
       CadClienteDAO ClienteDao = new CadCLienteImpl();  
            ClienteDao.Inserir(Cliente);  
            context.addMessage(null, new FacesMessage("Cadastro Concluido com Sucesso !"));  
     
  
  
    }
H

Segue uma POC bem simples pra vc testar.

public class Cliente {

	private String nome;
	private String idade;
	private String sexo;
	private String fone;
	private String rg;
	private String end;
	
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getIdade() {
		return idade;
	}
	public void setIdade(String idade) {
		this.idade = idade;
	}
	public String getSexo() {
		return sexo;
	}
	public void setSexo(String sexo) {
		this.sexo = sexo;
	}
	public String getFone() {
		return fone;
	}
	public void setFone(String fone) {
		this.fone = fone;
	}
	public String getRg() {
		return rg;
	}
	public void setRg(String rg) {
		this.rg = rg;
	}
	public String getEnd() {
		return end;
	}
	public void setEnd(String end) {
		this.end = end;
	}
}
import java.io.Serializable;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

import com.teste.pojos.Cliente;

@ManagedBean(name="clienteBean")
@SessionScoped
public class ClienteBean implements Serializable {

	private static final long serialVersionUID = 1L;
	private Cliente cliente;
	
	public ClienteBean(){
		cliente = new Cliente();		
	}
	
	public void inserirCliente(){
		System.out.println("Passei pelo inserirCliente !!!");
		//chama aqui o seu DAO

		FacesContext context = FacesContext.getCurrentInstance();
		context.addMessage(null, new FacesMessage("Cadastro Concluido com Sucesso !")); 
	}

	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}
	
}
<!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:ui="http://java.sun.com/jsf/facelets"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:p="http://primefaces.org/ui">

<h:head>
	<title>Cadastro</title>
</h:head>
<h:body>
	<h:form id="cadastroCliente">
		    
            <p:growl id="growl" showDetail="true" sticky="true" />    
            <h:panelGrid id="display" columns="3" cellpadding="8" style="margin:0 auto;">    
  
  
                <h:outputText value="Nome :"/>    
                <h:outputText value="Idade:"/>    
                <h:outputText value="Sexo:" />    
                <p:inputText value="#{clienteBean.cliente.nome}" style="width: 250px;"/>  
                <p:inputText value="#{clienteBean.cliente.idade}" style="width: 25px;"/>  
                <p:selectOneMenu value="#{clienteBean.cliente.sexo}">    
                    <f:selectItem itemLabel="Selecione" itemValue="" />    
                    <f:selectItem itemLabel="Masculino" itemValue="Masculino" />    
                    <f:selectItem itemLabel="Feminino" itemValue="Feminino" />    
  
                </p:selectOneMenu>    
  
                <h:outputText value="RG:" />    
                <h:outputText value="Telefone:" />    
                <h:outputText value="Endereço:" />    
                <p:inputText value="#{clienteBean.cliente.rg}" style="width: 250px;"/>  
                <p:inputText value="#{clienteBean.cliente.fone}" style="width: 250px;"/>  
                <p:inputText value="#{clienteBean.cliente.end}" style="width: 250px; text-align: left;"/>  
            </h:panelGrid>    
  
            <p:separator/>  
            <p:commandButton   value="Salvar"   update="growl"   actionListener="#{clienteBean.inserirCliente}" />  
            	
	</h:form>
</h:body>
</html>

Espero que ajude !!!!

F

mas no metodo inserir não precisa do Action Event?

F

Valeio Bezerra não funcionou cara , deve ser alguma cosinha to quebrando a cabeça aqui , por que não da nenhum erro , acontece nada.

V

Eu utilizo sem rs

H

Não precisa … neste caso vc não precisa de nada do evento, por isso não precisa dele na assinatura do metodo no bean.

H

franz Ozil,

Vc possui mais que um form no seu xhtml ?
Ja tive problemas parecidos quando tentei usar mais que um form no mesmo xhtml.

posta seu xhtml completo.

F

não funcionou não , Hmsilva esse POC que você mandou e bem semelhante ao que eu estou fazendo ^^ será que é algum bug do prime faces 3.4.1 ? realmente não sei onde eu errei … é foda kk

F

tenho 2 forms , o que ocorria hm silva?

V

pode ser por causa dos 2 forms mesmo, eu tinha problemas com eles nesse ponto de chamar a ação do botão.

F

e como vc resolveu ?

H

A POC que te mandei não funcionou no seu ambiente…??? estranho, porque no meu funcionou, e estou usando o prime 3.4.1.

H

Cara, pra ser bem sincero não descobri o motivo exato do erro. Só identifiquei que quando eu tinha mais que um form os requests não funfavão.
Ai então (eu tinha essa possibilidade) passei a usar somente um form por arquivo e o problema acabou.

Tb identifiquei que eu estava usando desnecessariamente muitos forms. Com apenas 1 form eu faço tudo que preciso.

V

tirei um dos forms. No caso o segundo form

D

Se voce tirar o parametro que esta passando dentro do seu actionListerner já ira funcionar, isto na pagina xhtml, e não esqueça de mapear o seu managedBean face-config.xml

H

Cara, no JSF 2 não é mais necessario o arquivo face-config.xml

H

Posta o seu xhtml como era antes (com 2 forms) pra eu dar uma olhada …

V

Rapaz isso faz tempo. é só tirar um dos seus forms.

F

tirei o action event coloquei o ajax= “false” agora esta dando esta excessão …

/index.xhtml @55,93 value="#{clienteBean.cliente.nome}": Target Unreachable, 'null' returned null
F

pessoal perdi uma noite de sono kkk tentando e tentando e não consegui descobrir nada , apenas que fica variando tem hora que o erro postado acima , tem hora que não acontece nd … ta fooda rs

F

estou confuso , pois eu coloquei o ajax=“false” ele conseguiu verificar que meu campo idade e inteiro , mas se eu preencho certo ele não salva e nem entra no meu metodo de inserção …


F

Pessoal consegui resolver , depois de muita lutaaa era um simples detalhe.
o modo como eu chamava meu metodo bean .

antes

actionListener="#{clientesBean.inserirCliente()}"

depois

actionListener="#{clientesBean.getinserir()}"

lendo um pouco descobri que no XHTML interpretado os metodos como getters e setters , eu não levei muita fé mas funcionou muito obrigado a todos
ah e tmb ajax= “false” .

Criado 26 de novembro de 2012
Ultima resposta 30 de nov. de 2012
Respostas 23
Participantes 4