GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

<p:commandButton actionListener=""> não invoca método do manage bean

Boa noite a todos, estou com a seguinte situação: tenho um p:commandButton que quando clicado deve executar um método no meu managebean pelo “evento” actionListernet e também abrir um p:dialog pelo evento onclick. A questão é que quando clico no botão o método no manage bean não é acionado, somente o evento onclick. Alguém sabe o porque? Desde já agradeço pela ajuda.

Segue as linhas de código relevantes ao problema:

botão no xhtml

<p:commandButton actionListener="#{cotacaoMB.alterarFornecedor}" onclick="selecaoFornecedor.show()" type="button" image="ui-icon-plus" > <f:attribute name="tpFornecedor" value="segundo"/> </p:commandButton>

manage bean

@SessionScoped
@ManagedBean(name="cotacaoMB")
public class CotacaoMB {
	
	public void alterarFornecedor(ActionEvent evt){
		String idFor = (String) evt.getComponent().getAttributes().get("tpFornecedor");
		this.setIdFornecedor(idFor);
	}	

Boa noite Gabriel!

Acho que posso te ajudar com algumas dicas:

  1. Já verificou se o p:commandButton está dentro de um <h:form>? Acho que precisa estar pra funcionar corretamente.

  2. O p:commandButton do PrimeFaces vem por padrão com o atributo “ajax=true”, ou seja, você deveria utilizá-lo para realizar alguma funcionalidade do ajax, como renderizar componentes, etc. Você pode setar o atributo ajax=false se quiser utilizar algum processamento sem ser ajax, por exemplo, para acessar dados de um bean ou mesmo fazer a navegação forward. O própria FAQ do PrimeFaces já alerta quanto a navegação: http://www.primefaces.org/faq.html

  3. Já tentou usar o <f:param> no lugar do <f:attribute>?

Outra idéia seria (acredito que vc já tenha feito…) colocar um breakpoint no início de seu método e verificar se ao clicar no botão o método é acionado, pois se for, então o problema está no método e não na view.

Espero ter ajudado.

Até +!

Boa notie vinnysoft, primeiramente obrigado pelas dicas. Respondendo as mesmas, o commandbutton está sim dentro de um h:form, vou esperiemntar criar um somente para o botão e ver o que acontece! Testei tbm setando a propriedade ajax=“false” porém o resultado foi o mesmo e o f:param segundo um outro tópico que pesquisei é utilizado para commandLink, não tenho certeza mas eles disseram isto. E eu estou monitorando sim pelo breakpoint, até mudei os botões para h:commandButton para ver o que acontece e o método foi acionado normalmente, o problema é que o h:commandButton da um submit na página, preciso impedir este submit mas ainda não sei como hehe

Olá Gabriel!

Tem como vc colocar todo o código da view para entender melhor o contexto?

Ah,

outra ideia que tive seria vc utilizar o action do p:commandButton ao invés de actionListener… Não me lembro onde li, mas me parece que um é para quando o retorno é void e o outro é para quando o retorno é uma String, ai já executaria a navegação.

Até +!

sem problemas

[code]<?xml version='1.0' encoding='UTF-8' ?>

<ui:composition template="/paginas/principais/principal.xhtml">	
	<ui:define name="conteudo">
		<!-- INÍCIO DO FORM DE COTAÇÃO -->
		<h:form id="formCotacao">
			<p:outputPanel id="painelNovaCotacao">
				<p:messages id="menssagens"/>
				<p:dialog id="dialogo" header="Aguarde..." modal="true" widgetVar="saveDialog" closable="false" height="100" width="60" 
					resizable="false" appendToBody="true">
						<p:ajaxStatus style="width:16px;height:16px; position: center;">
							<f:facet name="start">
								<h:graphicImage value="/imagens/loading.gif" style="position: center;"/>
							</f:facet>					
						</p:ajaxStatus>
				</p:dialog>		
				<p:panel id="painelCotacao">
					<p:fieldset legend="Cotação">
						<h:panelGrid columns="3" cellpadding="2">
							<h:outputLabel value="Cliente"/>
							<h:outputLabel value=""/>
							<h:outputLabel value="Data"/>
							<p:inputText id="idCliente" value="#{cotacaoMB.cotacao.cliente.pessoa.nome}" readonly="true" />
							<p:commandButton onclick="selecaoCliente.show()" type="button" image="ui-icon-circle-plus"/>
							<p:calendar id="idData" value="#{cotacaoMB.cotacao.dtCotacao}" navigator="true" pattern="dd/MM/yyyy" required="true" requiredMessage="Data é obrigatório!" showOn="button"/>
						</h:panelGrid>	
					</p:fieldset>
					<p:fieldset legend="Pedido 1">		
						<h:panelGrid columns="7" cellpadding="2">
							<h:outputLabel value="Fornecedor"/>
							<h:outputLabel value=""/>
							<h:outputLabel value="Produto"/>
							<h:outputLabel value="Valor"/>
							<h:outputLabel value="Quantidade"/>
							<h:outputLabel value="Frete"/>						
							<h:outputLabel value="Total"/>
							<p:inputText id="idFornecedor" value="#{cotacaoMB.primeiroFornecedor}" readonly="true"/>				
							<p:commandButton actionListener="#{cotacaoMB.alterarFornecedor}" onclick="selecaoFornecedor.show()" type="button" image="ui-icon-circle-plus">
								<f:attribute name="tpFornecedor" value="primeiro"/>
							</p:commandButton>																	
							<p:inputText id="idProduto" value="#{cotacaoMB.cotacao.produto1}" required="true" requiredMessage="Produto em Pedido 1 é obrigatório!"/>
							<p:inputMask id="idValor" value="#{cotacaoMB.cotacao.valorProduto1}" mask="999999990,?00" dir="RTL" required="true" requiredMessage="Valor do produto em Pedido 1 é obrigatório!"/>
							<p:inputMask id="idQuantidade" value="#{cotacaoMB.cotacao.quantidade1}" mask="999999990,?00" dir="LTR" required="true" requiredMessage=" Quantidade em Pedido 1 é obrigatório!"/>
							<p:inputMask id="idFrete" value="#{cotacaoMB.cotacao.valorFrete}" mask="9999999990,?00" dir="LTR" required="true" requiredMessage="Valor do frete em Pedido 1 é obrigatório!"/>
							<p:inputMask id="idTotal" value="#{cotacaoMB.cotacao.totalPedido}" mask="999999990,?00" dir="LTR" readonly="true"/>						
						</h:panelGrid>	
					</p:fieldset>
					<p:fieldset legend="Pedido 2">	
						<h:panelGrid columns="7" cellpadding="2">
							<h:outputLabel value="Fornecedor"/>
							<h:outputLabel value=""/>
							<h:outputLabel value="Produto"/>
							<h:outputLabel value="Valor"/>
							<h:outputLabel value="Quantidade"/>
							<h:outputLabel value="Frete"/>
							<h:outputLabel value="Total"/>
							<p:inputText id="idFornecedor2" value="#{cotacaoMB.segundoFornecedor}" readonly="true"/>
							<p:commandButton actionListener="#{cotacaoMB.alterarFornecedor}" onclick="selecaoFornecedor.show()" type="button" image="ui-icon-circle-plus" >
								<f:attribute name="tpFornecedor" value="segundo"/>
							</p:commandButton>	
							<p:inputText id="idProduto2" value="#{cotacaoMB.cotacao.produto2}" />
							<p:inputMask id="idValor2" value="#{cotacaoMB.cotacao.valorProduto2}" mask="999999990,?00" dir="RTL"/>
							<p:inputMask id="idQuantidade2" value="#{cotacaoMB.cotacao.quantidade2}" mask="999999990,?00" dir="LTR"/>
							<p:inputMask id="idFrete2" value="#{cotacaoMB.cotacao.valorFrete2}" mask="999999990,?00" dir="LTR"/>
							<p:inputMask id="idTotal2" value="#{cotacaoMB.cotacao.totalPedido2}" mask="999999990,?00" dir="RLT"/>						
						</h:panelGrid>
					</p:fieldset>
					<h:panelGrid columns="2" cellpadding="2">
						<p:commandButton id="btGravar" value="Salvar" actionListener="#{cotacaoMB.gravar}" update="menssagens" onclick="saveDialog.show()" oncomplete="saveDialog.hide()" image="ui-icon ui-icon-disk"/>							
						<p:commandButton id="btNovo" value="Novo" type="reset" actionListener="#{cotacaoMB.limparTudo}" immediate="true" update="mensagens" image="ui-icon ui-icon-refresh"/>										
					</h:panelGrid>	
				</p:panel>	
			</p:outputPanel>
		</h:form><!-- /formNovaCotacao -->
		<!-- FORM DIALOGS -->
		<h:form>
			<!-- DIALOG PARA SELEÇÃO DE CLIENTE -->						
			<p:dialog id="selecaoClienteDialog" header="Seleção de cliente" widgetVar="selecaoCliente" height="470" width="1200" 
				draggable="true" resizable="false" >					
				<p:panel id="painelBuscarCliente" header="Buscar por" toggleable="true" >		
			  		<p:dialog id="dialogo2" header="Aguarde..." modal="true" widgetVar="saveDialog" closable="false" height="100" width="60" 
						resizable="false" appendToBody="true" styleClass="loadDialog" >								
						<p:ajaxStatus style="width:16px;height:16px; position: center;">
							<f:facet name="start">
								<h:graphicImage value="/imagens/loading.gif" style="position: center;"/>
							</f:facet>					
						</p:ajaxStatus>								
					</p:dialog>				
					<p:messages id="msgPesquisa"/>
					<h:panelGrid columns="5" cellpadding="2">
						<h:outputLabel value="Nome: "/>
						<h:outputLabel value="CPF/CNPJ: "/>
						<h:outputLabel value="Logradouro: "/>
						<h:outputLabel value="Cidade: "/>
						<h:outputLabel value=""/>
						<p:inputText id="nmClienteArg" maxlength="50" size="35" value="#{cotacaoMB.nomeClienteArg}"/>							
						<p:inputText id="ccClienteArg" maxlength="20" size="20" value="#{cotacaoMB.cpfCnpjClienteArg}" converterMessage="Informe somente números no campo CPF/CNPJ!"/>
					  	<p:inputText id="logClienteArg" maxlength="50" size="35" value="#{cotacaoMB.logradouroClienteArg}"/>
						<p:inputText id="cidClienteArg" maxlength="35" size="25" value="#{cotacaoMB.cidadeClienteArg}"/>
						<p:commandButton id="btPesquisarCli" value="Pesquisar" image="ui-icon ui-icon-search"  actionListener="#{cotacaoMB.pesquisarCliente}" update="listarClientes, msgPesquisa" 
							onclick="saveDialog.show()" oncomplete="saveDialog.hide()" />
					</h:panelGrid>										
				</p:panel><!-- /painelBusca -->					
				<p:dataTable id="listarClientes" var="cliente" value="#{cotacaoMB.listaClientes}" paginator="true" rows="7" emptyMessage=" ">
					<f:facet name="header">
						Lista de clientes cadastrados
					</f:facet>
					<p:column headerText="Nome">
						<h:outputText value="#{cliente.pessoa.nome}"/>
					</p:column>					
					<p:column headerText="CPF/CNPJ">						
						<h:outputText value="#{cliente.pessoa.cpfCnpjFormatado}"/>
					</p:column>
					<p:column headerText="Logradouro">						
						<h:outputText value="#{cliente.pessoa.logradouro}"/>
					</p:column>
					<p:column headerText="Cidade">						
						<h:outputText value="#{cliente.pessoa.cidade}"/>
					</p:column>						
				    <p:column headerText="Selecione" style="width:32px">
				       <p:commandButton image="ui-icon ui-icon-pencil" onclick="selecaoCliente.hide()" update="formCotacao">
				           <f:setPropertyActionListener value="#{cliente}" target="#{cotacaoMB.cotacao.cliente}" />
				        </p:commandButton>
					</p:column>				         
				</p:dataTable><!-- /listaClientes -->			
			</p:dialog><!-- /DIALOG PARA SELEÇÃO DE CLIENTE -->
			<!-- DIALOG PARA SELEÇÃO DE FORNECEDOR -->						
			<p:dialog id="selecaoFornecedorDialog" header="Seleção de fornecedor" widgetVar="selecaoFornecedor" height="470" width="1200" 
				draggable="true" resizable="false" >					
				<p:panel id="painelBuscarFornecedor" header="Buscar por" toggleable="true">		
		  			<p:dialog id="dialogo" header="Aguarde..." modal="true" widgetVar="saveDialog" closable="false" height="100" width="60" 
						resizable="false" styleClass="loadDialog" appendToBody="true">
							<p:ajaxStatus style="width:16px;height:16px; position: center;">
								<f:facet name="start">
									<h:graphicImage value="/imagens/loading.gif" />
								</f:facet>					
							</p:ajaxStatus>
					</p:dialog>				
					<p:messages id="msgPesquisa2"/>
					<h:panelGrid columns="4" cellpadding="2">
						<h:outputLabel value="Nome: "/>
						<h:outputLabel value="CPF/CNPJ: "/>
						<h:outputLabel value="Atividade: "/>
						<h:outputLabel value=""/>
						<p:inputText id="nmForArg" maxlength="50" size="35" value="#{cotacaoMB.nomeFornecedorArg}"/>
						<p:inputText id="cpfCnpjForArg" maxlength="20" size="20" value="#{cotacaoMB.cpfCnpjFornecedorArg}" converterMessage=" "/>
					  	<h:selectOneMenu value="#{cotacaoMB.atividade}">
							<f:selectItems value="#{cotacaoMB.atividades}" var="atv" noSelectionValue="Selecione" itemLabel="#{atv.descricao}" />
							<f:converter converterId="cvtAtividade"/>
						</h:selectOneMenu>
						<p:commandButton value="Pesquisar" image="ui-icon ui-icon-search" id="btPesquisarFor" actionListener="#{cotacaoMB.pesquisarFornecedor}" update="listarFornecedores msgPesquisa2" 
							onclick="saveDialog.show()" oncomplete="saveDialog.hide()"/>
					</h:panelGrid>										
				</p:panel><!-- /painelBusca -->
				<p:dataTable id="listarFornecedores" var="fornecedor" value="#{cotacaoMB.listaFornecedores}" paginator="true" rows="7" emptyMessage=" ">
					<f:facet name="header">
						Lista de fornecedores cadastrados
					</f:facet>
					<p:column headerText="Nome">
						<h:outputText value="#{fornecedor.pessoa.nome}"/>
					</p:column>					
					<p:column headerText="CPF/CNPJ">						
						<h:outputText value="#{fornecedor.pessoa.cpfCnpjFormatado}"/>
					</p:column>
					<p:column headerText="Atividade">						
						<h:outputText value="#{fornecedor.atividade.descricao}"/>
					</p:column>
					<p:column headerText="Cidade">						
						<h:outputText value="#{fornecedor.pessoa.cidade}"/>
					</p:column>						
			        <p:column headerText="Editar" style="width:32px">
			            <p:commandButton image="ui-icon ui-icon-pencil" action="#{cotacaoMB.adicionarFornecedor}" onclick="selecaoFornecedor.hide()" update="formCotacao">
			                <f:setPropertyActionListener value="#{fornecedor}" target="#{cotacaoMB.fornecedorSelecionado}" />
			            </p:commandButton>
			        </p:column>				         
				</p:dataTable><!-- /listaFornecedores -->
			</p:dialog><!-- /DIALOG PARA SELEÇÃO DE FORNECEDOR -->					
		</h:form><!-- /FORM DIALOGS -->		
	</ui:define>
</ui:composition>
[/code]

Sim, o action deve ser utilizado quando tem navegação de página, como não estou fazendo navegação entre páginas estou usando o actionListener

Olá Gabriel!

Minhas idéias estão acabando! kkk

Outra pergunta:

  1. Você está precisando que o botão executa paralelamente as duas funções: o onClick e o action? Não sei se dar pra fazer isso…

  2. Os outros p:commandButtons que possuem os dois atributos setados estão funcionando?

Até +!

Você já deu uma olhada no ShowCase do PrimeFaces?

Tem um exemplo que ele usa o onClick e o actionListener: http://www.primefaces.org/showcase/ui/watermark.jsf

<p:commandButton actionListener="#{watermarkBean.search}" value="Ajax"  
            onclick="PrimeFaces.cleanWatermarks();" oncomplete="PrimeFaces.showWatermarks();"  />   

Já tentou usar no oncomplete pra ver se funciona?

Até +!

E então, algum sucesso?

Demorei, o tempo ta curto não tive como vir antes postar a solução que adotei, mas enfim, não consegui descobri o problema de não acessar a action e resolvi da seguinte forma: troquei o p:commandButton por h:commandButton e desabilitei o ajax para não submeter o form, conforme o código a seguir.

<f:ajax disabled="false"> <h:commandButton actionListener="#{cotacaoMB.alterarFornecedor}" onclick="selecaoFornecedor.show()" type="button" image="/imagens/add.png" > <f:attribute name="tpFornecedor" value="segundo"/> </h:commandButton> </f:ajax>

Essa era fácil.

Os botões do PrimeFaces tem por padrão ajax.

Então só coloca ali ajax=“false” e ta funcionando seu <p:commandButton.

Cya

1 Curtida

Inicialmente tbm achei que o problema era desabilitar o ajax do p:commandButton, tanto é que foi a primeira coisa que fiz, porém não obtive sucesso, por isto usei o h:commandButton com ajax desabilitado.

Galera, sei que o tópico é antigo, mas outras pessoas podem se deparar com esse mesmo erro.

Aconteceu exatamente isso comigo e eu resolvi simplesmente colocando o atributo immediate=“true” no <p:commandLink/>.

Flw!

O tópico é antigo mais vou dar um “revive” nele como gears of war… rs

Bom eu enfrento o mesmo problema de todos ai em cima, fiz todas as sugestões dadas aqui e algumas outras.

Porém nada funcionou, o immediate funcionou parcialmente, mas eu tenho um objeto pessoa e com o immediate=true ele não atualizava o form novamente, mesmo no Managedean tendo a linha pessoa = new Pessoa(); ele exibia os valores antigos.

Alguém conseguiu uma solução definitiva???

O que mais me deixa nervoso é que em outro projeto eu tenho a mesma situação, da mesma maneira, a mesma estrutura de montagem das páginas, uso templates e inserts, e neste outro projeto tudo está funcionando, sem immediate, sem mudar o ajax do commandLink ou commandButton.

Foi humilhação rs, mas para este projeto que não estava funcionando, para fazer o que queria tive que colocar dois forms, um com os inputs e outro com os commandLinks.

O commandLink executa o método, e atualiza todos os forms corretamente, se alguém conseguiu uma solução definitiva agradeço… Porque olhando os dois projetos não consegui encontrar nenhuma diferença.

Tentou colocar o ManagedBean anotado com @ViewScoped?

Saudações.

Sim, meu ManagedBean está com o ViewScoped.
Quando coloquei um form para o botão e um form para o cadastro funciona tudo normal grava no banco e etc.
O que acho mais estranho é que no outro projeto funciona. Vou tentar trocar o jar do Prime Faces.

Estou sem o código agora, mas quando chegar em casa posto o código para o pessoal.

Saudações.

Resolvi o problema, não tinha nada a ver com o ManagedBean, immediate ou ajax.

O problema estava na classe de mapaeamento do Hibernate, estava faltando um método set para uma propriedade.
Para fazer um teste tinha colocado um h:commandLink e quando ele executou a função do botão ele me retornou o erro “clase does not have a writable property”, então comecei a procurar e encontrei o método set que estava faltando. :idea: :?

Vlw pela ajuda pessoal.

[quote=Gabriel Garcia]Boa noite a todos, estou com a seguinte situação: tenho um p:commandButton que quando clicado deve executar um método no meu managebean pelo “evento” actionListernet e também abrir um p:dialog pelo evento onclick. A questão é que quando clico no botão o método no manage bean não é acionado, somente o evento onclick. Alguém sabe o porque? Desde já agradeço pela ajuda.

Segue as linhas de código relevantes ao problema:

botão no xhtml

<p:commandButton actionListener="#{cotacaoMB.alterarFornecedor}" onclick="selecaoFornecedor.show()" type="button" image="ui-icon-plus" > <f:attribute name="tpFornecedor" value="segundo"/> </p:commandButton>

manage bean

[code]

@SessionScoped
@ManagedBean(name=“cotacaoMB”)
public class CotacaoMB {

public void alterarFornecedor(ActionEvent evt){
	String idFor = (String) evt.getComponent().getAttributes().get("tpFornecedor");
	this.setIdFornecedor(idFor);
}	

[/code][/quote]

[code]

Caros,

sei que já faz um tempinho mais passei pelo mesmo problema recentemente. A solução encontrada por mim foi diferente das postadas aqui, e isso me motivou a postar a solução.

Ei retirei o atributo “type=button”

ou seja

<p:commandButton actionListener="#{cotacaoMB.alterarFornecedor}" onclick=“selecaoFornecedor.show()” image=“ui-icon-plus” >
<f:attribute name=“tpFornecedor” value=“segundo”/>
</p:commandButton>[/code]

espero que seja util…vlw

eu tava com problemas com um botão simples… que só precisava esconder um Dialog…

e o maldito não funcionada… tenho em outras telas o MESMO botão… com o código exatamente igual…
e nessa tela não funcionava, nem printava erro…

&lt;p:commandButton id="cancelButton" update=":dialogForm:infosImovelProp" icon="ui-icon-close" value="Cancelar" oncomplete="dialogImovelPropProp.hide()" immediate="true"/&gt;
mudei para:

&lt;p:commandButton id="cancelButton" update=":dialogForm:infosImovelProp" icon="ui-icon-close" value="Cancelar" onclick="dialogImovelPropProp.hide()" immediate="true"/&gt;
onCONPLETE para onCLICK e funcionou… agora… se vc precisa realmente enviar as infos do form
eu tenho o seguinte botão…:

&lt;p:commandButton id="createButton" update=":tabelaForm, :dialogForm:infosImovelProp" value="Adicionar" icon="ui-icon-disk" oncomplete="if(!args.validationFailed){dialogImovelProp.hide();}" rendered="#{empty imovelPropController.imovelProp.id}" actionListener="#{imovelPropController.adicionarImovelProp}"/&gt;
talvez pegando como base ai nos meus botões … talvez vcs consigam algo… o/*

public void adicionarImovelProp(ActionEvent actionEvent){...}
//