P:commandbutton não chama método do bean

25 respostas
D

Bão, estou com um erro estranho ....
Tenho um commandobutton em uma tela que chama um Método em um Bean, até nada de anormal, o problema é quando tentei criar outro commandbutton e não consigo chamar o método e estou tendo esse problema com alguns botões de minha tela, alguem ja passou por isso ??

<p:commandButton value="Adicionar" ajax="true" update="formPos" immediate="true"
						actionListener="#{funcionarioBean.adicionaCurso}" icon="ui-icon ui-icon-disk"/>
public void adicionaCurso(){
	
		CursoRepository cr = new CursoRepository(getEntityManager());
		curso.setFuncionario(getFuncionario());
		curso.setDataCadastro(new Date());
		curso.setHoraCadastro(new Date());
		curso.setUsuarioCadastro(getUsuarioSessao());
		System.out.println("ANTES DE GRAVAR");
		cr.gravar(curso);
		System.out.println("DEPOIS DE GRAVAR");
		curso = new Curso();
		cursoPorFuncionario();
	
	}

25 Respostas

D

Provavelmente há algum erro na criação dos componentes da tela que está impedindo os botões de executarem suas ações.
Usando o firebug (ou similar) você consegue depurar e ver onde é o erro.

D

Certo, no Firebug ele me traria o Id do componente que não esta sendo “criado” ?

D

Não, você precisa ver o que está ocorrendo de errado na renderização dos componentes.

D

Certo … vou ver o que consigo aqui …

D

Bem, instalei ele aqui … não sei usa-lo então não sei como analisar os resultados das ferramentas … Mas vi que quando executo o botão as informações dos campos estão carregadas …
Pois bem, vc saberia me dizer “o que” preciso procurar ?

cadastroFuncionario:dados... cadastroFuncionario:dadosDiversos:formPos cadastroFuncionario:dados... POS cadastroFuncionario:dados... POS cadastroFuncionario:dados... C cadastroFuncionario:dados... 29/05/2013 cadastroFuncionario:dados... 29/05/2013 cadastroFuncionario:dados... cadastroFuncionario:dadosDiversos:formPos:j_idt195:j_idt210 cadastroFuncionario:dados... 0 javax.faces.ViewState 8093414117231008368:6790396580739241715 javax.faces.partial.ajax true javax.faces.partial.execu... @all javax.faces.partial.rende... :formPos javax.faces.source cadastroFuncionario:dadosDiversos:formPos:j_idt195:j_idt210

D

Quando você clica em um p:commandButton ou num p:commandLink ele espera que todos os elementos da página estejam de acordo.
Pode ser que algum deles necessite de um converter (ou espere um converter), pode ser que algum deles esteja vazio e não deveria estar vazio.
Há muitas possibilidades.
O que você precisa tentar é identificar algo que esteja fora do normal.

I

Tenta deixa o ajax=“false” pra ver

D

Certo, vamos lá então.
Quanto ao converter não uso nada nessa página que necessite dele.
Existem alguns campos “obrigatórios” mas eles já estão preenchidos.
Pensando por esse lado, o uso do Immediate=true já deveria resolver não acha ? Ou estou falando besteira ?

D

Com ajax false tb não vai e tb não quero que seja rendenizada a tela toda …

T

Não vi na sua demonstração o commandButton dentro de um h:form amigo…

D

vou postar o código todo !! Detalhe: esse é o commandbutton que funfa !!

<!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"
	xmlns:pe="http://primefaces.org/ui/extensions">

<h:form id="formFormacao" prependId="false">
	<p:accordionPanel>
		
		<p:tab title="Formulário" id="tabFormacoes">
		
			<h:panelGrid columns="2" columnClasses="colunaEsquerda,colunaDireita">
				<h:outputText value="Curso: "/>
				<p:inputText value="#{funcionarioBean.formacao.curso}"
							 size="50"
							 onkeydown="this.value = this.value.toUpperCase();"
							 id="nomeFormacao"/>
										
				<h:outputText value="Instituição: "/>
				<p:inputText value="#{funcionarioBean.formacao.instituicao}"
							 size="75"
							 onkeydown="this.value = this.value.toUpperCase();"
							 id="instituicaoFormacao"/>
											
				<h:outputText value="Situação: "/>
				<p:selectOneMenu value="#{funcionarioBean.formacao.situacao}" id="situacaoFormacao">
					<f:selectItem itemLabel="Escolha "  itemValue=""/>			 
					<f:selectItem itemLabel="Cursando"  itemValue="C"/>
					<f:selectItem itemLabel="Concluído" itemValue="F"/>			 
				</p:selectOneMenu>
											
				<h:outputText value="Início: "/>
				<p:calendar value="#{funcionarioBean.formacao.dataInicio}"
							size="10"
							pattern="dd/MM/yyyy"
							locale="pt_BR"
							id="inicioFormacao"/> 
											
				<h:outputText value="Conclusão: "/>
				<p:calendar value="#{funcionarioBean.formacao.dataConclusao}"
							size="10"
							pattern="dd/MM/yyyy"
							locale="pt_BR"
							id="conclusaoFormacao"/>
										
				<p:commandButton value="Salvar" ajax="false" update="formFormacao" immediate="true" id="btnSalvarFormacao"
						actionListener="#{funcionarioBean.adicionaFormacao}" icon="ui-icon ui-icon-disk"/>
						   		
			 	<p:commandButton value="Limpar" update="formFormacao" action="#{funcionarioBean.limparFormacao}"
			   					icon="ui-icon ui-icon-trash" immediate="true" process="@this" id="btnLimparFormacao">
					<pe:resetEditableValues for="formFormacao"/>			
				</p:commandButton>							 
			</h:panelGrid>
		</p:tab>	
	</p:accordionPanel>
</h:form>
</html>
Esse não funfa !!
<p:commandButton value="Adicionar" ajax="true" update=":cadastroFuncionario:formPos" immediate="true" id="btnAddPos"
						actionListener="#{funcionarioBean.adicionaPos}" icon="ui-icon ui-icon-disk"/>
N

Amigo, tira o immediate e no seu método adicionaCurso coloca assim na declaração dele:

public void adicionaCurso(ActionEvent event){
//Seu Código Aqui
}
D

Infelizmente a mesma coisa !!!

T

vai estreitando seu problema até ter certeza do que é.

Já colocou a action desse botão que não funciona num desses botões que funcionam e viu o que acontece?

Já debugou o método para ver se o botão está realmente chamando ele?

Já olhou no console do firebug o que ele diz quando vc clica no botão?

D

Então … Esse command que chama o método, ele chama qualquer um que eu ligar nele, quanto que os outros não, ele não chama …

T

Vc está querendo dizer, que quando vc coloca sua action

nos botões salvar ou limpar e ele não entra no método. é isso?

e quanto ao firebug, o que ele diz?

D

Não cara … assim, vou tentar explicar melhor …
Naquele formulário de Formações, tem um commandbutton que chama qualquer método que eu ligar nele …
Porém eu tenho outros formulários com outros commandbutton que NÃO chamam os métodos … Porém, se eu ligar esses métodos que não são chamados ao command que esta no Formulário de Formações o método é chamado !!

O

cara, eu tive um problema do tipo

tua pagina, ta tentando carregar uma outra pagina no meio de uma principal? ou algo assim?
exemplo: clica numa opção do menu e depois aparece a outra pagina no centro da principal?

se sim, tenta executar só essa pagina que vai ser carregada no meio e testa se teu botao vai funcionar.
se funcionar, cria um template pra ser a pagina principal, foi o que eu fiz.

B

cara tenta assim no xhtml

<p:commandButton value="Adicionar Preço"
                                 ajax="false" type="submit"
                                 actionListener="#{Bean.metodo()}"/>

bean

public void metodo(){
        
    }

poem em debug e ve se vai entrar no metodo…

lembre - se de usar um form por pagina, e verifique se vc esta nao esta passando um valor diferente para bean por exemplo um campo int no <p:inputMask

O

esse é o problema

por isso que eu falei pra ele criar o template, pq se ele simplesmente chamar uma pagina dentro da outra, vai ter mais de um form
e isso vai da problema

bom criar o template. Bota um system.out.print desse metodo e executa essa página isoladamente…ve se aparece no console o print

D
Bem, eu tenho um Tamplate principal, onde é já vem com o Menu carregado, então deixo o "Center" para ser carregadas outras páginas ... Realmente, por questão de ficar mais "prática" a manutenção, usei um TabView e as Abas chamam outras páginas ... assim: Página "funcionario.xhtml" ela "chama" o tamplate:
<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"
	xmlns:pe="http://primefaces.org/ui/extensions">

<ui:composition template="/tamplate/tamplate.xhtml">
	<ui:define name="center">
Agora as "Abas" que chamam as outras páginas
<!--@@@@@@@@@@@@ CARREGA TELA DE GRADUAÇÃO @@@@@@@@@@@@@@-->	
<p:tab title="Formações" id="tabFormacao" rendered="#{funcionarioBean.funcionario.id != null}">
						
	<ui:include src="/pages/formacao/formacao.xhtml"/>
				
</p:tab>
<!--@@@@@@@@@@@@ CARREGA TELA DE PÓS GRADUAÇÃO @@@@@@@@@@@@@@-->
<p:tab title="Pós Graduações" id="tabPos" rendered="#{funcionarioBean.funcionario.id != null}">
		
	<ui:include src="/pages/formacao/posgraduacao.xhtml"/>
						
</p:tab>
<!--@@@@@@@@@@@@ CARREGA TELA DE CURSOS/PALESTRAS @@@@@@@@@@@@@@-->
<p:tab title="Cursos - Palestras" id="tabCurso" rendered="#{funcionarioBean.funcionario.id != null}">
						
	<ui:include src="/pages/formacao/cursos.xhtml"/>
						
</p:tab>
Porém o botão que esta dentro da pagina Formação funciona e os que estão nas demais não ... Porém se eu ligar o botão da pag formação no método da que deveria ser chamado pela pag Pós ele funfa ...

Vou testar como sugeriram ...

D

Não funfou com o type !!

O

testa botar essa pagina que n ta funcionando, fora do template, cria ela isolada deixa feia mesmo, coisa rapida e testa o botao dela

D

Bem, fiz um teste assim:
Peguei o formulário de Pós e joguei dentro da página do Funcionário, e o método foi chamado …
Agora … sera que pode ser erro na forma que estou “chamando” essa outra página [url]?

D

Realmente eu devo estar com algum problema “grande” na página ou no Bean, pois agora tenho esse Erro:

O objeto não esta sendo preenchido com os dados do formulário e como os atributos da classe estão anotados como “@Column(nullable=false)” ocorro esse erro …
Que zebra viu …

Criado 29 de maio de 2013
Ultima resposta 30 de mai. de 2013
Respostas 25
Participantes 7