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

23 respostas
franz_Ozil

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

franz_Ozil

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 !"));  
     
  
  
    }
hmsilva

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

franz_Ozil

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

franz_Ozil

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

hmsilva

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.

hmsilva

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.

franz_Ozil

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

franz_Ozil

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.

franz_Ozil

e como vc resolveu ?

hmsilva

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

hmsilva

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

hmsilva

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

hmsilva

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.

franz_Ozil

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
franz_Ozil

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

franz_Ozil

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 …


franz_Ozil

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