a4j + RichFaces submete página duas vezes

6 respostas
V

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

6 Respostas

Javabuntu

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

V

neste caso não. vlw

V

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

rponte

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…

V

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

Muito obrigado.

B

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.

Criado 22 de abril de 2008
Ultima resposta 15 de abr. de 2013
Respostas 6
Participantes 4