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

25 respostas
Diego_Adriano

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

drsmachado

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.

Diego_Adriano

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

drsmachado

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

Diego_Adriano

Certo … vou ver o que consigo aqui …

Diego_Adriano

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

drsmachado

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.

igor_ks

Tenta deixa o ajax=“false” pra ver

Diego_Adriano

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 ?

Diego_Adriano

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…

Diego_Adriano

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"/>
nazarenoneto

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

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?

Diego_Adriano

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?

Diego_Adriano

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.

b10machado

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

Diego_Adriano
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 ...

Diego_Adriano

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

Diego_Adriano

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

Diego_Adriano

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