a4j + RichFaces submete página duas vezes

Pessoal tenho um crud básico e ao subter o formulário, o mesmo é submetido duas vezes. Comprovei isso pelo debug (para duas vezes) e em uma chamada javascript que emite um alert();
Estou postando o código para facilitar a ajuda.

Alguém saberia me explicar o porque isso acontece?

Muito obrigado.

JSP

<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>

<%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<%@ taglib prefix="rich" uri="http://richfaces.org/rich"%>
<%@ taglib prefix="a4j" uri="http://richfaces.org/a4j"%>

<html>
	<head>   
		<title>SICOOP - Sistema de Controle Operacional</title>
		<link type="text/css" rel="stylesheet" href="../../styles/style.css"/>
		<script type="text/javascript" src="../../js/mascara.js"></script>
		<script type="text/javascript" src="../../js/fechar.js"></script>
	</head>
	<body>
		<div id="divContainer">
			<f:view>
				<a4j:form id="form">
					<rich:panel styleClass="panel">
						<f:facet name="header">
							<h:outputText value="Cadastro de clientes"/>
						</f:facet>
						
						<h:panelGrid columns="3">
							<h:outputLabel for="cnpj" value="CNPJ*"/>
							<h:inputText id="cnpj" value="#{cliente.clnt.cnpj}" maxlength="18" size="16" required="true" onkeypress="return mascara(this, 'CNPJ', event)">
								<f:validator validatorId="ValidatorCnpj"/>
							</h:inputText>
							<rich:message for="cnpj" errorClass="msgValidationError">
								<f:facet name="passedMarker">
									<h:graphicImage value="../../images/passed.gif"/>
								</f:facet>
								<f:facet name="errorMarker">
									<h:graphicImage value="../../images/error.gif"/>
								</f:facet>
							</rich:message>



.
.
.


						</h:panelGrid>
						
						<rich:toolBar style="width: 97.5%;">
							<a4j:commandButton id="btnSalvar" value="Salvar" action="#{cliente.salvar}" styleClass="btn"/>
							<a4j:commandButton id="btnNovo" value="Novo" action="#{cliente.abrirNovo}" immediate="true" styleClass="btn"/>
							<a4j:commandButton id="btnExcluir" value="Excluir" action="#{cliente.excluir}" immediate="true" styleClass="btn"/>
							<a4j:commandButton id="btnVoltar" value="Voltar" action="#{cliente.voltar}" immediate="true" styleClass="btn"/>
							<a4j:commandButton id="btnFechar" value="Fechar" immediate="true" onclick="fechar();" styleClass="btn"/>
						</rich:toolBar>
					</rich:panel>
				</a4j:form>
			</f:view>
		</div>
	</body>
</html>

MB

	public String salvar() throws Exception{
		/*Remove os caracteres de formatação do cpf*/
		String cpf = this.fncnr.getCpf().replaceAll("\\.", "");
		cpf = cpf.replaceAll("-", "");
		this.getFncnr().setCpf(cpf);
		
		this.getFncnr().setInUtzo("S");
		
		new FncnrDAO().persist(this.getFncnr());
		
		return ConstantesUtil.SUCESSO_FUNCIONARIO;
	}

se pedir pra salvar, ta criando dois registros no banco :?:

neste caso não. vlw

sei que o fato de chamar o método duas vezes é devido ao ciclo de vida, mas o alert em javascript não pode aparecer duas vezes…

Será se terei que procurar outra solução???

Obrigado

Na verdade o ciclo de vida não executa duas vezes o método de ação no managed bean! O que estou realmente achando estranho é que não vejo problemas no teu código e não estou conseguindo entender o porque do framework executar duas vezes o método!

Te aconselho a ir isolando os componentes na tua página e ir testando, começa com a página simples e depois vai colocando os componentes um a um e testando…

realmente não havia pensado nisso… vou testar amanhã e posto o resultado aqui…

Muito obrigado.

Pessoal, estou reabrindo este post pois estou com o mesmo problema…

Eu tenho no meu xhtml o seguinte comando:

<a4j:commandLink styleClass="no-decor" 
      actionListener="#{uploadMateriaisController.insert}" 
      execute="@form"
      oncomplete="if (#{facesContext.maximumSeverity==null}) {alert('O upload dos arquivos foi realizado com sucesso.'); document.location.href = document.location.href;}"
      onclick="return confirmaSalvar();"
      render="fileUploadMsg">
      <h:graphicImage value="../images/salvar.jpg" style="border:0px"/>
</a4j:commandLink>

E no meu bean:

public void insert(ActionEvent actionEvent) {
	Usuario usuarioLogado = ((Usuario) session.getAttribute(Constantes.USER));
	
	try {
		uploadMateriaisService.insert(arquivos, segmentoMercadoPRG, tipoMaterial, usuarioLogado);
		prepareNew(actionEvent);
	} catch (PersistenceException pe) {
		String mensagem = "Ocorreu um erro ao salvar os arquivos.";
		addFailureMessage(Constantes.complementaExcecao(mensagem), null);
	} catch (InvalidFieldValueException ifve) {
		addFailureMessage(ifve.getFieldId(), ifve.getMessage(), null);
	} catch (ServiceException se) {
		addFailureMessage(se.getMessage(), null);
	} catch (Exception ex) {
		addFailureMessage(ex.getMessage(), null);
	}
}  

Quando eu chamo o método insert e o mesmo não demora para ser executado, tudo funciona normalmente, porem, quando ele demora para ser executado(Método que salva e distribui arquivos de imagens e vídeos) o método é chamado novamente pela aplicação. Nos logs simplesmente aparece uma nova requisição com uma nova thread.
Alguém já passou por isso?

Obrigado.