[Resolvido] jsf2+primefaces e ajax = problemas de execução de metodos

Boa tarde a todos …
estou desenvolvendo uma pequena aplicação com jsf2 ,usando os componentes do primefaces porém enfrento alguns problemas…
tenho uma pagina com um formulario e outra pagina com uma lista,eu insiro um funcionario no forumario,vou na lista ele está lá,beleza,porém,
quando eu clico pra editar ele,ele popula no meu ManagedBean o funcionario e leva para o formulario,populando todos os inputs,beleza,porém,quando eu tento
atualizar o funcionario,não acontece nada,ele não executa o actionListner e modo algum.
então tentei colocar a lista e o formulario na mesma pagina e tratar os eventos com ajax,atualmente a pagina está assim

[code]<p:fieldset legend=“Adicionar funcionarios” >
<h:form>
<p:messages id=“messages” showDetail=“true” autoUpdate=“true” closable=“true” />
<h:inputText value="#{funcionarioBean.funcionario.id}" />
<h:panelGrid columns=“4” columnClasses=“label, value” styleClass=“panelGridCenter”>

                <h:outputText value="Nome : *" />  
                <p:inputText required="true" label="nome"  requiredMessage="é necessario digitar o nome"
                        value="#{funcionarioBean.funcionario.nome}" />  
                  
                <h:outputText value="CPF: *" />  
                <p:inputMask mask="999.999.999-99" requiredMessage="é necessario digitar o cpf" converter="convertInput" required="true" label="cpf"  
                        value="#{funcionarioBean.funcionario.cpf}"  />  

                <h:outputText value="Endereço" />  
                <p:inputText value="#{funcionarioBean.funcionario.endereco}" requiredMessage="é necessario digitar o endereço"
                 required="true" label="endereco" />  
                  
                <h:outputText value="CEP :* " />  
                <p:inputMask mask="99.999-999" converter="convertInput"
                 value="#{funcionarioBean.funcionario.cep}" requiredMessage="é necessario digitar o cep" required="true" />  
                
                <h:outputText value="Bairro :* " />
                <p:inputText value="#{funcionarioBean.funcionario.bairro}" required="true" requiredMessage="é necessario digitar o bairro" />
                
                <h:outputText value="Cidade : *" />  
                <p:selectOneMenu required="true" requiredMessage="é necessario escolher uma cidade" value="#{funcionarioBean.funcionario.cidade}">  
	            	<f:selectItem itemLabel="Rio de janeiro" itemValue="Rio de janeiro" />  
	            	<f:selectItem itemLabel="Nilopolis" itemValue="Nilopolis" />
	            	<f:selectItem itemLabel="Caxias" itemValue="Caxias" />
	            	<f:selectItem itemLabel="Pavuna" itemValue="Pavuna" />  
	        	</p:selectOneMenu>
	        	
	        	<h:outputText value="Estado : *" />
	        	<p:selectOneMenu required="true" requiredMessage="é necessario escolher um estado" value="#{funcionarioBean.funcionario.estado}" >
                    <f:selectItem itemLabel="RJ" itemValue="RJ" />
                    <f:selectItem itemLabel="SP" itemValue="SP" />
                    <f:selectItem itemLabel="MG" itemValue="MG" />
               </p:selectOneMenu>  
          

                <h:outputText value="Email : *" />
                
                <p:inputText required="true" label="Email"  
                        value="#{funcionarioBean.funcionario.email}" requiredMessage="é necessario digitar um email" validatorMessage="email invalido" >
                        	<f:validateRegex 
	pattern="^[_A-Za-z0-9-\+]+(\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\.[A-Za-z0-9]+)*(\.[A-Za-z]{2,})$" />
                         </p:inputText>  
                  
                <h:outputText value="Telefone :* " />  
                <p:inputMask mask="(99)9999-9999" converter="convertInput" required="true" requiredMessage="é necessario digitar um telefone" value="#{funcionarioBean.funcionario.telefone}"/>  
                 
            
                <h:outputText value="Perfil : *" />  
                <p:selectOneMenu required="true" requiredMessage="é necessario escolher um perfil" value="#{funcionarioBean.funcionario.perfil}">  
	            	<f:selectItem itemLabel="Administrador" itemValue="Administrador" />  
	            	<f:selectItem itemLabel="Funcionario" itemValue="Funcionario" />  
	        	</p:selectOneMenu>
                  
                <h:outputText value="Login :* " />  
                <p:inputText required="true" requiredMessage="é necessario digitar um login" value="#{funcionarioBean.funcionario.login}"/>
                
                <h:outputText value="Senha :*" />  
                <p:password  value="#{funcionarioBean.funcionario.senha}" required="true" requiredMessage="é necessario escolher uma senha" /> 
                
                 <p:commandButton value="Submit"   update="@all" process="@form" actionListener="#{funcionarioBean.adicionaAltera}" > 
                 </p:commandButton>  [/code]

quando eu clico no submit ele salvar o funcionario

[code]public void adicionaAltera(ActionEvent actionEvent){
EntityManager manager = this.getManager();
FuncionarioRepositoryImpl repository = new FuncionarioRepositoryImpl(manager);

	System.out.println(funcionario.getId());
	
	System.out.println(funcionario.getId());
	if(this.funcionario.getId() == 0 ){
		repository.adiciona(funcionario);
		System.out.println("Adicionou");
		FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Sucesso", "funcionario inserido com sucesso!")); 
		funcionario = null;
	}else{
		repository.atualiza(funcionario);
		System.out.println("Alterou");
		FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Sucesso", "funcionario alterado com sucesso!"));
		funcionario = null;
	}
	
}[/code]

ele recarrega o seguinte dataTable

[code]<p:fieldset legend=“Listar funcionarios” >

	<h:form>
	<p:dataTable  var="funcionarios" value="#{funcionarioBean.funcionarios}" paginator="true" rows="8"
	selection="#{funcionarioBean.funcionarioRemover}" rowKey="#{funcionarios.id}" emptyMessage="Sem funcionarios" >  

    <f:facet name="header">  
        Lista de todos os usuarios  
    </f:facet>  

    <p:column  selectionMode="multiple"> 
    </p:column>  
	
	<p:column headerText="id" >
		#{funcionarios.id}
	</p:column>
	
    <p:column headerText="Nome">  
       #{funcionarios.nome}  
    </p:column>  

    <p:column headerText="CPF">  
       #{funcionarios.cpf} 
    </p:column>  

    <p:column headerText="Endereço">  
        #{funcionarios.endereco} 
    </p:column>  

    <p:column headerText="Cidade">  
        #{funcionarios.cidade}
    </p:column>  
    
    <p:column headerText="Estado">  
        #{funcionarios.estado}
    </p:column>  
    
    <p:column headerText="Bairro">  
        #{funcionarios.bairro}
    </p:column>  
    
    <p:column headerText="Telefone">  
        #{funcionarios.telefone}
    </p:column>  
    
    <p:column headerText="cep">  
        #{funcionarios.cep}
    </p:column>  
    
    <p:column headerText="Email">  
        #{funcionarios.email}
    </p:column>  
    
    <p:column headerText="Login">  
        #{funcionarios.login}
    </p:column>  
    
    <p:column headerText="Perfil">  
        #{funcionarios.perfil}
    </p:column>  
	
	<p:column headerText="Alterar">
		<p:commandButton value="alterar" update="@all" process="@form" actionListener="#{funcionarioBean.altera}"/>  
	</p:column>
	
    <f:facet name="footer">  
        <p:commandButton value="deletar selecionados" update="@all" process="@form" action="#{funcionarioBean.remove}" />
    </f:facet>  
</p:dataTable> 
</h:form>
</p:fieldset>[/code]

até ai beleza,a lista atualiza direitnho,porém quando eu clico para alterar

public void altera(){ funcionario = (Funcionario) funcionarios.getRowData(); }

ele popula os inputs do formulario,como eu queria,ai quando eu clico para alterar…
Não acontece nada,nada,nada posso clicar 5,10,30 vezes que ele não executa o metodo de adicionar e alterar
agora se eu der um F5 e clicar,ele altera…
alguem sabe como eu posso resolver isso?
conseguir alterar sem ter que ficar apertando F5?

o managedBean completo

[code]package br.com.loja_games.controle.pessoal;

import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.persistence.EntityManager;
import javax.servlet.http.HttpServletRequest;
import br.com.loja_games.modelo.Funcionario;
import br.com.loja_games.repositorio.FuncionarioRepositoryImpl;

@ManagedBean
@SessionScoped
public class FuncionarioBean {
Funcionario funcionario = new Funcionario();
DataModel funcionarios;
List funcionarioRemover;

public void adicionaAltera(ActionEvent actionEvent){
	EntityManager manager = this.getManager();
	FuncionarioRepositoryImpl repository = new FuncionarioRepositoryImpl(manager);
	
	System.out.println(funcionario.getId());
	
	System.out.println(funcionario.getId());
	if(this.funcionario.getId() == 0 ){
		repository.adiciona(funcionario);
		System.out.println("Adicionou");
		FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Sucesso", "funcionario inserido com sucesso!")); 
		funcionario = null;
	}else{
		repository.atualiza(funcionario);
		System.out.println("Alterou");
		FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Sucesso", "funcionario alterado com sucesso!"));
		funcionario = null;
	}
	
}

public void remove(){

	System.out.println(funcionarios);
	
	for(Funcionario funcionario : funcionarioRemover){
		EntityManager manager = this.getManager();
		FuncionarioRepositoryImpl repository = new FuncionarioRepositoryImpl(manager);
		repository.remove(funcionario);
	}
}

public  DataModel<Funcionario> getFuncionarios(){
	EntityManager manager = this.getManager();
	FuncionarioRepositoryImpl repository = new FuncionarioRepositoryImpl(manager);
	funcionarios = new ListDataModel(repository.getLista());
	return funcionarios ;
}

public void procura(){
System.out.println("passou por aqui...");
	EntityManager manager = this.getManager();
	FuncionarioRepositoryImpl repository = new FuncionarioRepositoryImpl(manager);
	FacesContext fc = FacesContext.getCurrentInstance();
	HttpServletRequest request = (HttpServletRequest) fc.getExternalContext().getRequest();
	Long id =  Long.parseLong(request.getParameter("id"));
	System.out.println(id);
	funcionario = repository.procura(id);
	request = null;
	System.out.println(funcionario.getNome()); 
	
}

public void altera(){
	funcionario = (Funcionario) funcionarios.getRowData();
}


private EntityManager getManager() {
	FacesContext fc = FacesContext.getCurrentInstance();
	ExternalContext ec = fc.getExternalContext();
	HttpServletRequest request = (HttpServletRequest) ec.getRequest();
	return (EntityManager) request.getAttribute("EntityManager");
}


public Funcionario getFuncionario() {
	return funcionario;
}

public void setFuncionario(Funcionario funcionario) {
	this.funcionario = funcionario;
}





public void setFuncionarios(DataModel<Funcionario> funcionarios) {
	this.funcionarios = funcionarios;
}

public List<Funcionario> getFuncionarioRemover() {
	return funcionarioRemover;
}

public void setFuncionarioRemover(List<Funcionario> funcionarioRemover) {
	this.funcionarioRemover = funcionarioRemover;
}

}
[/code]
Obrigado

O problema está no teu método de edição, então.
Provavelmente, após popular os campos com os dados a serem editados, alguma coisa errada acontece, fazendo com que a requisição não chegue ao método que serve de listener para o evento ajax. Se você der uma estudada em JSF2, conseguirá entender as várias fases e cada um dos erros possíveis em cada parte do ciclo de vida.

o que dificulta a resolução do problema é que nem exception no console dispara,simplesmente não acontece nada,é como se eu não tivesse apertado o botão,porem,
quando eu atualizo a pagina,e clico para alterar novamente,ele altera…

[quote=Slow17]o que dificulta a resolução do problema é que nem exception no console dispara,simplesmente não acontece nada,é como se eu não tivesse apertado o botão,porem,
quando eu atualizo a pagina,e clico para alterar novamente,ele altera…[/quote]
Usa alguma ferramenta como o firebug?

não,eu debugo tudo mostrando os dados que estão sendo passados no console,pra ver se está nulo e etc,nem debug do eclipse tenho costume de usar…

Sugiro que comece a utilizar.
Você precisa ver erros na requisição ajax, que não chegam aos métodos nas classes java e, também, erros que podem ocorrer nas classes java.
O uso de debug é fundamental para quem desenvolve.

Sugiro que comece a utilizar.
Você precisa ver erros na requisição ajax, que não chegam aos métodos nas classes java e, também, erros que podem ocorrer nas classes java.
O uso de debug é fundamental para quem desenvolve.[/quote]
Geralmente quando eu to trabalhando com javascript ou css eu uso o developer tools do chrome…

Sugiro que comece a utilizar.
Você precisa ver erros na requisição ajax, que não chegam aos métodos nas classes java e, também, erros que podem ocorrer nas classes java.
O uso de debug é fundamental para quem desenvolve.[/quote]
Geralmente quando eu to trabalhando com javascript ou css eu uso o developer tools do chrome…[/quote]
Já ajuda.
Tente realizar o submit do formulário com o developer tools aberto, na aba network e verifique se ocorre erro. Normalmente algo está errado aí e você consegue identificar.

Sugiro que comece a utilizar.
Você precisa ver erros na requisição ajax, que não chegam aos métodos nas classes java e, também, erros que podem ocorrer nas classes java.
O uso de debug é fundamental para quem desenvolve.[/quote]
Geralmente quando eu to trabalhando com javascript ou css eu uso o developer tools do chrome…[/quote]
Já ajuda.
Tente realizar o submit do formulário com o developer tools aberto, na aba network e verifique se ocorre erro. Normalmente algo está errado aí e você consegue identificar.[/quote]
ele recarrega todos os elementos da pagina e não exibe erro nenhum…

endendi qual é mais ou menos o problema,sempre que faz duas chamadas ajax,a primeira funciona,se você tentar chamar em seguida o ajax novamente,ele dá esse problema,
ele chama todos os elementos da pagina porém não processa nada,se você ficar clicando ele vai ficar chamando repetidamente os elementos porém não faz chamada a metodo
nenhum do entitymanager,mas quando você atualiza a pagina,ele volta a funcionar navamente…
vou mudar de versão do prime faces pra ver se resolve isso…

[quote=Slow17]endendi qual é mais ou menos o problema,sempre que faz duas chamadas ajax,a primeira funciona,se você tentar chamar em seguida o ajax novamente,ele dá esse problema,
ele chama todos os elementos da pagina porém não processa nada,se você ficar clicando ele vai ficar chamando repetidamente os elementos porém não faz chamada a metodo
nenhum do entitymanager,mas quando você atualiza a pagina,ele volta a funcionar navamente…
vou mudar de versão do prime faces pra ver se resolve isso…[/quote]
Isso não tem sentido.

[quote=drsmachado][quote=Slow17]endendi qual é mais ou menos o problema,sempre que faz duas chamadas ajax,a primeira funciona,se você tentar chamar em seguida o ajax novamente,ele dá esse problema,
ele chama todos os elementos da pagina porém não processa nada,se você ficar clicando ele vai ficar chamando repetidamente os elementos porém não faz chamada a metodo
nenhum do entitymanager,mas quando você atualiza a pagina,ele volta a funcionar navamente…
vou mudar de versão do prime faces pra ver se resolve isso…[/quote]
Isso não tem sentido.[/quote]
eu também acho que não tem sentido,porém é oque está acontecendo…

[quote=Slow17][quote=drsmachado][quote=Slow17]endendi qual é mais ou menos o problema,sempre que faz duas chamadas ajax,a primeira funciona,se você tentar chamar em seguida o ajax novamente,ele dá esse problema,
ele chama todos os elementos da pagina porém não processa nada,se você ficar clicando ele vai ficar chamando repetidamente os elementos porém não faz chamada a metodo
nenhum do entitymanager,mas quando você atualiza a pagina,ele volta a funcionar navamente…
vou mudar de versão do prime faces pra ver se resolve isso…[/quote]
Isso não tem sentido.[/quote]
eu também acho que não tem sentido,porém é oque está acontecendo…[/quote]
Tenho quase certeza que não é isso.
Provavelmente você dispara a requisição e ocorre erro em alguma das fases anteriores à atribuição dos valores dos campos aos objetos no managed bean.

Eu cliquei no botão de alterar umas 30 vezes e olha quantos elementos ele chamou na pagina…


isso sem disparar erro nenhum no console… ai dou um F5 ,clico e pimba,Funcionario alterado com sucesso!

ae consegui resolver machado,porém tive que tirar todas as requisições do ajax e fazer com varias paginas,como havia feito antes,porém quando eu realizo o metodo de
alterar eu dou um redirect para a pagina de adicionar ,dai ela já carrega populada porque o funcionario está armazenada não sessão e consegue alterar tranquilo sem dar f5.
antes estava acontecendo algo como request.foward em que o programa executa a mudança de pagina,porém a pagina antiga continua rodando na aplicação,já dando um
redirect o programa deixa de executar a pagina antiga e se concentra só na pagina atual… algo na pagina de listar estava conflitando o metodo de adicionar funcionarios…
enfim obrigado pela ajuda ae …