{ RESOLVIDO; } Mostrar mensagem <p:message> quando senha e senhaCompara forem diferentes

Ae pessoal,

Já estou tentando a + de 3 dias e não consegui resolver:

No meu xhtml, quero cadastrar o usuario, este irá informar os dados basicos e a senha e outro campo para verificar a senha. Quando as senhas forem diferentes, o sistema deve mostrar uma mensagem avisando.

Ae que vem o problema… Quero mostrar a mensagem usando <p:message>, mas ela só aparece caso eu use <p:messages>

Já testei vários códigos que peguei na internet e em uma lista de e-mail, mas ainda nada. Segue o código que parece chegar mais perto do que preciso.

usuaarioAdd.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:p="http://primefaces.prime.com.tr/ui">
    <ui:composition template="/WEB-INF/templates/default.xhtml">
        <ui:define name="conteudo">
            <f:view>
                <h:form id="formUsuario">
                    <h:outputText value="#{msgs.titUsuNew}"/>
                    <br/>
                    <h:panelGrid columns="3" id="grid">
                        <h:outputLabel for="txtNome" value="#{msgs.lbUsuNome}"/>
                        <p:inputText id="txtNome" value="${usuarioMNG.nome}"/>
                        <p:message for="txtNome" showDetail="true"/>

                        <h:outputLabel for="cmbSetor" value="#{msgs.lbUsuSetor}"/>
                        <h:selectOneMenu id="cmbSetor" converter="setorConverter" value="#{usuarioMNG.setor}">
                            <f:selectItems value="#{setorMNG.listaSelectItem}" var ="vSetor" itemLabel="#{vSetor.nome}"/>
                        </h:selectOneMenu>
                        <p:message for="cmbSetor" showDetail="true"/>

                        <h:outputLabel for="cmbCargo" value="#{msgs.lbUsuCargo}"/>
                        <h:selectOneMenu id="cmbCargo" converter="cargoConverter" value="#{usuarioMNG.cargo}">
                            <f:selectItems value="#{cargoMNG.listaSelectItem}" var ="vCargo" itemLabel="#{vCargo.nome}"/>
                        </h:selectOneMenu>
                        <p:message for="cmbCargo" showDetail="true"/>

                        <h:outputLabel for="txtLogin" value="#{msgs.lbUsuLogin}"/>
                        <p:inputText id="txtLogin" value="${usuarioMNG.login}"/>
                        <p:message for="txtLogin" showDetail="true"/>
                                           
                        <h:outputLabel for="txtSenha" value="#{msgs.lbUsuSenha}"/>
                        <p:password id="txtSenha"
                                    feedback="true" minLength="4"
                                    promptLabel="Informe sua nova senha"
                                    weakLabel="ruim"
                                    goodLabel="boa"
                                    strongLabel="ótima"
                                    value="${usuarioMNG.senha}"/>
                        <p:message for="txtSenha" showDetail="true"/>

                        <h:outputLabel for="txtSenhaConfirma" value="#{msgs.lbUsuSenhaConfirma}"/>
                        <p:password id="txtSenhaConfirma"
                                    feedback="false" minLength="4"
                                    value ="${usuarioMNG.senhaConfirma}"
                                    />
                        <p:message for="txtSenhaConfirma"/>
                        <h:inputHidden id="validaUsuario" value="validaUsuario" validator="#{usuarioMNG.validateMsgs}" />
                        <p:message for="validaUsuario" showDetail="true"/>
                    </h:panelGrid>
                    <br/>
                    <h:commandButton
                        value="#{msgs.btClear}">
                        <f:ajax render="@form" listener="#{usuarioMNG.clear}"/>
                    </h:commandButton>
                    <p:commandButton
                        value="Salvar"
                        action="#{usuarioMNG.save}"
                        update="grid"/>
                       </h:form>
            </f:view>
        </ui:define>
    </ui:composition>
</html>

[b]UsuarioMNG/b]

 public String save(FacesContext context, UIComponent component, Object value) {
        if (senha.equals(senhaConfirma)) {
            Usuario usu = new Usuario();
            usu.setLogin(this.login);
            usu.setSenha(this.senha);
            usu.setNome(this.nome);
            usu.setEnviaMemo(enviaMemo);
            usu.setSetor(this.setor);
            usu.setCargo(this.cargo);
            dao.create(usu);
            return "ok";
        } else {
            System.out.println("Senha: " + senha);
            System.out.println("Confi: " + senhaConfirma);
            FacesContext context2 = FacesContext.getCurrentInstance();
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Senhas não conferem!", null);
            context2.addMessage("formUsuario:validaUsuario", message);
            /*
             * funciona para <messageS>
             * FacesContext.getCurrentInstance().addMessage("txtSenhaConfirma" new FacesMessage(FacesMessage.SEVERITY_INFO, "Senhas diferentes", null));
             */
           
          // outro exemplo
         // FacesMessage message = new FacesMessage("Senhas diferentes");
         // FacesContext context = FacesContext.getCurrentInstance();
         //  context.addMessage(password.getClientId(context), message);
            return "nao";
        }
    }

public void validateMsgs(FacesContext context, UIComponent component, Object value) {
        if (context.getMaximumSeverity() != null) {
           ((UIInput) component).setValid(false);
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Campos marcados em vermelho são obrigatórios", null);
            context.addMessage(component.getClientId(context), message);
        }
    }

Essa ultima mensagem aparece quando há campos com erro, e quando nenhum tem, fora o senhaCompara, a mensagem do senhaCompara não aparece.

Alguem tem uma idéia?

Veja esse exemplo: http://www.primefaces.org/showcase/ui/messages.jsf

Obrigado,

é que o <p:message> em todo projeto está Ok, consigo enviar mensagens para ele e tudo mais, o problema está apenas no campo senha e senhaConfirma que não consigo enviar a mensagem quando eles são difrerentes, mas quando é <p:messageS> ae eu consigo. Mas quero usar o para não ficar diferente de todo projeto.

Veja através do código-fonte se o campo realmente é formUsuario:validaUsuario. Pelo visto sim.
Tente trocar inputHidden por inputtext só para ver se é por causa do hidden.

Vlw

amigo, faça assim:

no xhtml:

<p:message  for="xpto" id="xpto"/>

ou seja colocando for e id.
mas com p:message n consegui fazer funcionar, tanto que no site do primefaces só tem o messageS e para funcionar o message utilizei a <h:
colooque o id igual ao for da messagem e se a mensagem vai aparecer no message ele deve ter id diferente do label e input onde o cara vai digitar o login/senha.

ainda não funcionou.

A dúvida não é dificil, e sim chatinha de resolver. Porque seria apenas comparar 2 campos no xhtml verificando se são iguais, se diferentes, mostra mensagem. Daqui a pouco vou ter que usar messageS somente nessa parte do projeto ;-(

rapaz se em outra parte funciona observa essa parte e tenta ver o que vc ta fazendo de diferfente…

Coloque process=“formUsuario” para ver se muda algo. Suas senhas nas linhas 13 e 14 estão chegando conforme o que é digitado ?

As outras partes funcionam porque uso o @Parter verificando a regra dos campos, ja que confirmaSenha não tem como.

então vc terá de utilizar a tag <h:message for=“exemplo” id=“exemplo” />
e no MB vc informa o exemplo.
acho que é fazer como vc fez, mas utilizar o <h:, porque com <p:message acho que não vai!

não consegui nem com o ;-(

Em qual navegador está testando ?

IE e Firefox

algo vc ta fazendo de errado, pq com <h:message da tranquilaço!!!

to falando isso pq tive a mesma dúvida que vc e resolvi dessa forma: http://www.guj.com.br/java/241413-resolvido-jsf-retornar-uma-msg-informando-erro-no-login

Testase meu codigo e com o <h:message> funcionou?

Opa!!!

Após pesquisar em muitos lugares na internet e + 2 livros a solução para o meu problema e não conseguir resolve-lo… sem queres tava ajudando um amigo num trabalho da faculdade de JSF, e ele fez uma coisa muito simples para usar uma mensagem de erro, ja que não sabia usar o … setou uma variavel e no xhtml mandou exibir ela. O conteudo desta, mudava quando o usuario clicava no botao salvar.

codigo a baixo…

MNG

public String save() {
        if (senha.equals(senhaConfirma)) {
            Usuario usu = new Usuario();
            usu.setNome(this.nome);
            usu.setSetor(this.setor);
            usu.setCargo(this.cargo);
            usu.setEnviaMemo(enviaMemo);
            usu.setLogin(this.login);
            usu.setSenha(this.senha);
            dao.create(usu);
            return "ok";
        } else {
            this.setMsgSenha("SENHAS SÃO DIFERENTES");
            return "nao";
        }
    }

XHTML

<h:outputLabel for="txtSenha" value="#{msgs.lbUsuSenha}"/>
                        <p:password id="txtSenha"
                                    feedback="true" minLength="4"
                                    promptLabel="Informe sua nova senha"
                                    weakLabel="ruim"
                                    goodLabel="boa"
                                    strongLabel="ótima"
                                    value="${usuarioMNG.senha}"/>
                        <p:message for="txtSenha" showDetail="true"/>

                        <h:outputLabel for="txtSenhaConfirma" value="#{msgs.lbUsuSenhaConfirma}"/>
                        <p:password id="txtSenhaConfirma"
                                    feedback="false" minLength="4"
                                    value ="${usuarioMNG.senhaConfirma}"
                                    />
                        <h:outputLabel value="#{usuarioMNG.msgSenha}" />

Não é a melhor solução, mas resolve até encontrar a mais adequada.