[Resolvido] Não consigo acionar o "onerror"do commandButton usando JSF e Primefaces

Olá Amigos,

Estou programando com JSF, usando ManagedBean e usando o componente Primefaces, e tenho seguindo problema.

Estou tentando usar o “onerror” do <p:commandButton> do Primefaces. Pelo que eu saiba o “onerror” é usado para fazer alguma coisa na tela caso acorra algum erro ou Exception no meu ManagedBean do JSF, só que esse “onerror” não está sendo acionado quando jogo uma Exception para ele.

telaLogin.xhtml

&lt;p:commandButton value="teste" action="#autenticacaoBean.checarAutenticacao()}" ajax="true" immediate="false" onerror="confirmation.show()" /&gt;

&lt;p:dialog  appendToBody="true" header="Atencao" widgetVar="confirmation"  showEffect="bounce"&gt;
...
&lt;/p:dialog&gt;

autenticacaoBean

...
public void checarAutenticacao() throws Exception   {	

System.out.println("oi");       
throw new Exception("Exception Test");
}

Vocês sabem porque o “onerror” não é acionado (o dialog não aparece) ? Não aparece erro nenhum. Só aparece a String “oi” no meu console, comprovando que o método foi chamado e depois a strack trace com a Exception, mas eu gostaria que a dialog fosse aberta, conforme digitei no “onerror”.

Alguem consegue me ajudar.

Um abraço,

Gustavo

UP!

<p:commandButton value="teste" action="#autenticacaoBean.checarAutenticacao()}" ajax="true" immediate="false" onerror="confirmation.show()" />  
  
<p:dialog  appendToBody="true" header="Atencao" widgetVar="confirmation"  showEffect="bounce">  
...  
</p:dialog>

Substitua o onerror por oncomplete, e verifique se tem erro:

<p:commandButton value="teste" action="#autenticacaoBean.checarAutenticacao()}" ajax="true" oncomplete="if (!args.validationFailed) confirmation.show()" />  
  
<p:dialog  appendToBody="true" header="Atencao" widgetVar="confirmation"  showEffect="bounce">  
...  
</p:dialog>

ou

<p:commandButton value="teste" action="#autenticacaoBean.checarAutenticacao()}" ajax="true" oncomplete="#{facesContext.validationFailed ? 'confirmation.show()':' '}" />  
  
<p:dialog  appendToBody="true" header="Atencao" widgetVar="confirmation"  showEffect="bounce">  
...  
</p:dialog>

Olá amigos,

Esse post foi criado por mim em julho do ano passado, e eu já resolvi essa dificuldade, mas como a Juliana colocou no ar essa duvida de novo, vou postar aqui a minha solução para quem interessar.

O “onerror” ele não serve para erros no Bean como eu pensava, ele só é acionado para erros javaScript.

A minha solução foi abrir os Dialogs (popup) do primefaces pelo Bean, depois de certa condição.

Vou dar um exemplo:

[code]

<p:commandButton id=“btnSalvar” actionListener="#{meuBean.criar()}" />

public void criar() {

	if (!validarSenha()) { // se aqui der algum erro abre o dialog
		RequestContext.getCurrentInstance().execute("dialogErroVar.show()");				
	} else {			
		try {				
			delegate.criar(this.usuarioTO);				

		} catch (Throwable e) {
			RequestContext.getCurrentInstance().execute("dialogErroVar.show()");	
		} 
	}
}[/code]

Espero ter ajudado Juliana,

Um abraço,

Gustavo

Oi Gustavo, tudo bem?

Ontem pedi ajuda para um colega de trabalho e ele me deu essa solução também! Acabei resolvendo assim:

Commandbuttons na minha página cadastro usuário:

[code] <p:commandButton id=“cmdSalvar” value=“Salvar”
actionListener="#{cadastroUsuarioBean.salvar()}" type=“submit”
update=“confirma messageTab3”
rendered="#{!cadastroUsuarioBean.logado}" />

					&lt;p:commandButton id="cmdAtualizar" value="Atualizar"
						actionListener="#{cadastroUsuarioBean.salvar()}" type="submit"
						update="confirma messageTab3"
						rendered="#{cadastroUsuarioBean.logado}" /&gt;

[/code]

Os dialogs:

			&lt;p:confirmDialog widgetVar="dlgSalva" id="dlgSalva"
				message="Efetue seu Login com CPF e Senha cadastrados."
				header="Gravação de Usuário" severity="alert" update=":formCadastro"&gt;
				&lt;p:commandButton id="cmdOk" value="OK"
					oncomplete="dlgConfirma.hide()"
					action="/login_aluno?faces-redirect=true" /&gt;
			&lt;/p:confirmDialog&gt;

			&lt;p:confirmDialog widgetVar="dlgAltera" id="dlgAltera"
				message="Seus dados foram alterados."
				header="Alteração do cadastro de Usuário" severity="alert"
				update=":formCadastro"&gt;
				&lt;p:commandButton id="cmdOk2" value="OK"
					oncomplete="dlgAltera.hide()" action="/cursos?faces-redirect=true" /&gt;
			&lt;/p:confirmDialog&gt;

E o meu ManagedBean:

	public void salvar() {

		if (aluno.getCadastro().getLogradouro().getId() == 0) {
			JMensagemUtility.adicionarMensagemDeErro(
					JMensagemUtility.FORM_CADASTRO,
					JMensagemUtility.ENDERECO_INVALIDO);
			return;
		}

		try {
			if (aluno.getCadastro().getId() == 0) {

				alunoFacade.adiciona(aluno, aluno.getUsuarioWeb());
				//É enviado comando para o jsf para que o dialog de confirmação de cadastro seja exibido
				org.primefaces.context.RequestContext.getCurrentInstance()
						.execute("dlgSalva.show();");

			} else {
				alunoFacade.atualiza(aluno, aluno.getUsuarioWeb());
				//É enviado comando para o jsf para que o dialog de confirmação de alteração seja exibido
				org.primefaces.context.RequestContext.getCurrentInstance()
						.execute("dlgAltera.show();");
			}

			this.aluno = new Aluno();

			JMensagemUtility.adicionarMensagemDeSucesso(
					JMensagemUtility.FORM_CADASTRO,
					JMensagemUtility.SUCESSO_SALVAR);

		} catch (Exception ex) {
			JMensagemUtility.adicionarMensagemDeErro(
					JMensagemUtility.FORM_CADASTRO,
					JMensagemUtility.ERRO_SALVAR);
		}
	}

Mesmo assim muito obrigada pela ajuda Gustavo! :wink:
Abraço!

Ju

1 curtida