Problemas c/ evento onComplete do primefaces jsf 2.0, ñ se comportando como a4j:support [RESOLVIDO]

Olá pessoal, boa tarde.
Estou com um problema tremendo ao executar o evento onComplete do componente primefaces o qual dá suporte ao jsf 2.0
Anteriormente no jsf 1.2 utilizava o a4j:support, e este se comportava corretamente, onde o método era chamado e após ser concluído era exibido um alert.
Porém com o jsf 2.0 se comporta de maneira diferente, observem o código abaixo,
Tenho algo como:

<p:commandButton id="cbtIncluir" value="#{msg['botao.incluir']}" styleClass="botoes" immediate="false"
          action="#{usuarioController.salvar}" oncomplete="javascript:alert('Teste');" update="pgrUsuario">
</p:commandButton>

Nesse caso o evento oncomplete está se comportando de maneira semelhante ao evento onclick, onde a action salvar não está sendo executada
anteriormente, e ao ser finalizada um alert é demonstrado. O alert é exibido assim que o botão é acionado, e o método salvar nem foi chamado ainda.

Alguém teria alguma solução para esse problema?
Abs,
Lessandro

Conforme me pediram, segue a página xhtml e o bean utilizado. Quanto à versão do PrimeFaces é a 2.0 e o servidor de aplicações o Glassfih EE 6.

Página incluirUsuario.xhtml:


<?xml version='1.0' encoding='UTF-8' ?>
<!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:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:p="http://primefaces.prime.com.tr/ui">
    <ui:composition template="/resources/jsf/template.xhtml">

        <ui:define name="menu">
            <ui:include src="/resources/jsf/menu.xhtml" />
        </ui:define>

        <ui:define name="corpoDialog">
            <h:outputLabel id="oplMensagem" value="#{usuarioController.mensagem}" />
            <h:inputHidden />
            <h:commandButton id="cbtOk" value="#{msg['botao.ok']}" styleClass="botoes" immediate="true" action="#{usuarioController.preparaLista}" />
        </ui:define>

        <ui:define name="centro">
            <p:panel id="pnlCentro" style="position: relative; margin-top: 40px; margin-left: 300px; width: 450px;">
                <f:facet name="header">
                    <h:outputText value="#{msg['usuario.detalhe']}" styleClass="fonteTitulo" />
                </f:facet>
                <h:panelGrid columns="2" cellspacing="5px">
                    <h:outputLabel value="#{msg['usuario.nome']}" />
                    <h:inputText id="iptNome" value="#{usuarioController.selecionado.nmUsuario}" size="70" maxlength="100"
                                 onkeyup="this.value = somenteCaracteres(this.value)" required="true"
                                 requiredMessage="#{msg['usuario.nome.requerido']}" />
                    <h:inputHidden />
                    <h:message for="iptNome" styleClass="fonteAlerta" showDetail="true" showSummary="false" />
                    <h:outputLabel value="#{msg['usuario.rua']}" />
                    <h:inputText id="iptRua" value="#{usuarioController.selecionado.dsRua}" size="70" maxlength="100"
                                 onkeyup="this.value = somenteCaracteres(this.value)"
                                 required="true" requiredMessage="#{msg['usuario.rua.requerido']}" />
                    <h:inputHidden />
                    <h:message for="iptRua" styleClass="fonteAlerta" showDetail="true" showSummary="false" />
                    <h:outputLabel value="#{msg['usuario.bairro']}" />
                    <h:inputText id="iptBairro" value="#{usuarioController.selecionado.dsBairro}" size="51" maxlength="50"
                                 onkeyup="this.value = somenteCaracteres(this.value)" required="true"
                                 requiredMessage="#{msg['usuario.bairro.requerido']}" />
                    <h:inputHidden />
                    <h:message for="iptBairro" styleClass="fonteAlerta" showDetail="true" showSummary="false" />
                    <h:outputLabel value="#{msg['usuario.numero']}" />
                    <h:inputText id="iptNumero" value="#{usuarioController.selecionado.nuLocal}" size="11" maxlength="10"
                                 onkeypress="return somenteNumeros(event, false)" required="true"
                                 requiredMessage="#{msg['usuario.numero.requerido']}" />
                    <h:inputHidden />
                    <h:message for="iptNumero" styleClass="fonteAlerta" showDetail="true" showSummary="false" />
                    <h:outputLabel value="#{msg['usuario.cidade']}" />
                    <h:inputText id="iptCidade" value="#{usuarioController.selecionado.dsCidade}" size="51" maxlength="50"
                                 onkeyup="this.value = somenteCaracteres(this.value)" required="true"
                                 requiredMessage="#{msg['usuario.cidade.requerido']}" />
                    <h:inputHidden />
                    <h:message for="iptCidade" styleClass="fonteAlerta" showDetail="true" showSummary="false" />
                    <h:outputLabel value="#{msg['usuario.estado']}" />
                    <h:inputText id="iptEstado" value="#{usuarioController.selecionado.dsEstado}" size="3" maxlength="2"
                                 onkeyup="this.value = somenteCaracteres(this.value)" required="true"
                                 requiredMessage="#{msg['usuario.estado.requerido']}" />
                    <h:inputHidden />
                    <h:message for="iptEstado" styleClass="fonteAlerta" showDetail="true" showSummary="false" />
                    <h:outputLabel value="#{msg['usuario.cep']}" />
                    <h:inputText value="#{usuarioController.selecionado.nuCep}" size="9" maxlength="8" />
                    <h:outputLabel value="#{msg['usuario.login']}" />
                    <h:inputText id="iptLogin" value="#{usuarioController.selecionado.dsLogin}" size="21" maxlength="20" required="true"
                                 requiredMessage="#{msg['usuario.login.requerido']}" />
                    <h:inputHidden />
                    <h:message for="iptLogin" styleClass="fonteAlerta" showDetail="true" showSummary="false" />
                    <h:outputLabel value="#{msg['usuario.senha']}" />
                    <p:password id="pasSenha" value="#{usuarioController.selecionado.dsSenha}" minLength="0" size="50" maxlength="20"
                                weakLabel="#{msg['usuario.senha.fraca']}" goodLabel="#{msg['usuario.senha.boa']}"
                                strongLabel="#{msg['usuario.senha.excelente']}" promptLabel="#{msg['usuario.senha.requerido']}"
                                required="true" requiredMessage="#{msg['usuario.senha.requerido']}" />
                    <h:inputHidden />
                    <h:message for="pasSenha" styleClass="fonteAlerta" showDetail="true" showSummary="false" />
                    <h:outputLabel value="#{msg['usuario.perfil']}" />
                    <h:selectOneMenu value="#{usuarioController.selecionado.perfil}">
                        <f:converter converterId="perfilConverter" />
                        <f:selectItems value="#{usuarioController.listaPerfis}" var="perfil" itemLabel="#{perfil.nmPerfil}" itemValue="#{perfil}" />
                    </h:selectOneMenu>
                </h:panelGrid>
                <f:facet name="footer">
                    <h:commandButton value="#{msg['botao.voltar']}" styleClass="botoes" immediate="true" action="#{usuarioController.preparaLista}" />
                    <h:outputText value=" " />
                    <h:commandButton id="cbtIncluir" value="#{msg['botao.incluir']}" styleClass="botoes"  action="#{usuarioController.salvar}">
                        <f:ajax execute="@this" onevent="javascript:alert('oi');" />
                    </h:commandButton>
                </f:facet>
            </p:panel>
        </ui:define>
    </ui:composition>
</html>

Bean UsuarioController.java:


package br.com.notaroberto.controller;

//~--- non-JDK imports --------------------------------------------------------
import java.util.List;
import java.util.ResourceBundle;

import javax.faces.bean.ManagedBean;
import br.com.notaroberto.dao.UsuarioDAO;
import br.com.notaroberto.model.Perfil;
import br.com.notaroberto.model.Usuario;
import br.com.notaroberto.util.Constantes;
import br.com.notaroberto.util.JsfUtil;
import javax.faces.bean.SessionScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;

@ManagedBean(name = "usuarioController")
@SessionScoped
public class UsuarioController {

    private Usuario usuario;
    private UsuarioDAO usuarioDAO;
    private int idUsuarioSelecionado;
    private List<Usuario> listaUsuarios;
    private List<Perfil> listaPerfis;
    private String mensagem, msgDialog;

    public Usuario getSelecionado() {
        if (usuario == null) {
            usuario = new Usuario();
            idUsuarioSelecionado = -1;
        } else {
            if (idUsuarioSelecionado != -1) {
                usuario = recuperaUsuario(idUsuarioSelecionado);
            }
        }
        return usuario;
    }

    private UsuarioDAO getUsuarioDAO() {
        usuarioDAO = new UsuarioDAO();
        return usuarioDAO;
    }

    public void setListaUsuarios(List<Usuario> listaUsuarios) {
        this.listaUsuarios = listaUsuarios;
    }

    public List<Usuario> getListaUsuarios() {
        return listaUsuarios;
    }

    public List<Perfil> getListaPerfis() {
        return listaPerfis;
    }

    public void setListaPerfis(List<Perfil> listaPerfis) {
        this.listaPerfis = listaPerfis;
    }

    public int getIdUsuarioSelecionado() {
        return idUsuarioSelecionado;
    }

    public void setIdUsuarioSelecionado(int idUsuarioSelecionado) {
        this.idUsuarioSelecionado = idUsuarioSelecionado;
    }

    public String getMensagem() {
        return mensagem;
    }

    public void setMensagem(String mensagem) {
        this.mensagem = mensagem;
    }

    public String getMsgDialog() {
        return msgDialog;
    }

    public void setMsgDialog(String msgDialog) {
        this.msgDialog = msgDialog;
    }

    public String preparaLista() {
        recriaModelo();
        setListaUsuarios(getUsuarioDAO().buscaTodos());
        return Constantes.URL_MENU_USUARIO;
    }

    public String carregaListaPerfis() {
        PerfilController perfilController = new PerfilController();
        perfilController.preparaLista();
        setListaPerfis(perfilController.getListaPerfis());
        return null;
    }

    public String preparaCriacao() {
        usuario = new Usuario();
        idUsuarioSelecionado = -1;
        carregaListaPerfis();
        return Constantes.URL_INCLUIR_USUARIO;
    }

    public String preparaAlteracao() {
        carregaListaPerfis();
        return Constantes.URL_ALTERAR_USUARIO;
    }

    public Usuario recuperaUsuario(int idUsuarioSelecionado) {
        Usuario ususarioRecuperado = null;
        for (int i = 0; i < listaUsuarios.size(); i++) {
            if (listaUsuarios.get(i).getIdUsuario() == idUsuarioSelecionado) {
                ususarioRecuperado = listaUsuarios.get(i);
            }
        }
        return ususarioRecuperado;
    }

    public void salvar() {
        setMensagem("");
        setMsgDialog("");
        try {
            getUsuarioDAO().salva(usuario);
            setMensagem(ResourceBundle.getBundle("/message").getString("usuario.criadoSucesso"));
            setMsgDialog(Constantes.SHOW_DIALOG);
        } catch (Exception e) {
            setMensagem(e + " " + ResourceBundle.getBundle("/message").getString("PersistenceErrorOccured"));
            setMsgDialog(Constantes.SHOW_DIALOG);
        }
    }

    public String alterar() {
        try {
            getUsuarioDAO().altera(usuario);
            JsfUtil.addSuccessMessage(null, ResourceBundle.getBundle("/message").getString("UsuarioUpdated"));
            return "Exibe";
        } catch (Exception e) {
            JsfUtil.addErrorMessageExcecao(e, ResourceBundle.getBundle("/message").getString("PersistenceErrorOccured"));
            return null;
        }
    }

    public String excluir() {
        try {
            getUsuarioDAO().exclui(usuario);
            JsfUtil.addSuccessMessage(null, ResourceBundle.getBundle("/message").getString("UsuarioDeleted"));
            return "Exibe";
        } catch (Exception e) {
            JsfUtil.addErrorMessageExcecao(e, ResourceBundle.getBundle("/message").getString("PersistenceErrorOccured"));
            return null;
        }
    }

    private void recriaModelo() {
        setListaUsuarios(null);
    }

    public String autenticaUsuario() {
        String pagina = null;
        usuario = getUsuarioDAO().buscaLoginSenha(getSelecionado().getDsLogin(), getSelecionado().getDsSenha());
        if (usuario == null) {
            JsfUtil.addErrorMessage("form:iphMensagem", ResourceBundle.getBundle("/message").getString("usuario.naoEncontrado"));
        } else {
            pagina = Constantes.URL_MENU_HOME;
        }
        return pagina;
    }

    @FacesConverter(forClass = Usuario.class, value = "usuarioConverter")
    public static class UsuarioControllerConverter implements Converter {

        @Override
        public Object getAsObject(FacesContext facesContext, UIComponent component, String value) {
            if ((value == null) || (value.length() == 0)) {
                return null;
            }

            UsuarioController usuarioController = (UsuarioController) facesContext.getApplication().getELResolver().getValue(facesContext.getELContext(),
                    null, "usuarioController");

            return usuarioController.getUsuarioDAO().buscaPeloID(getID(value));
        }

        Integer getID(String value) {
            Integer id;
            id = Integer.valueOf(value);
            return id;
        }

        String getStringID(Integer value) {
            StringBuffer sb = new StringBuffer();
            sb.append(value);
            return sb.toString();
        }

        @Override
        public String getAsString(FacesContext facesContext, UIComponent component, Object object) {
            if (object == null) {
                return null;
            }

            if (object instanceof Usuario) {
                Usuario o = (Usuario) object;

                return getStringID(o.getIdUsuario());
            } else {
                throw new IllegalArgumentException("objeto " + object + " possui o tipo " + object.getClass().getName()
                        + "; tipo esperado: " + UsuarioController.class.getName());
            }
        }
    }
}

Detalhe: Tentei utilizar o f:ajax agora, mas também não funcionou. Utilize como exemplo o primeiro código que postei aqui substituindo o <p:commandButton> com o evento onComplete.

Resolvido por mim mesmo, com ajuda do Rafael. Segue a solução: http://www.guj.com.br/posts/list/205485.java