JSF e PrimeFaces - Mensagem personalizada [RESOLVIDO]

6 respostas
A

Fala pessoal blz?

Estou desenvolvendo com JSF 2.0 e PrimeFaces 2.2.1. Quando o usuário tira o foco do campo login eu verifico se este login já existe no banco. Se já existir eu quero mandar uma mensagem para ele. Estou fazendo com f:ajax. O método está sendo chamado mas a mensagem não está aparecendo. Alguém sabe o que estou fazendo de errado?

public void comparaLoginListener() {  
            if (medico.getLogin() != null  
                    && !medico.getLogin().equals("")  
                    && ServiceFactory.getInstance().getMedicoService()  
                            .findByLogin(medico.getLogin()) != null) {  
      
                FacesContext.getCurrentInstance().addMessage(  
                        "mensagem-medico-login",  
                        new FacesMessage(FacesMessage.SEVERITY_WARN,  
                                "Já existe um usuário com este login", null));  
                  
                medico.setLogin("");  
      
            }  
      
        }
<h:outputText value="Login: " for="medico-login" />         
            <p:inputText id="medico-login" required="true" value="#{medicoBean.medico.login}">  
            <f:ajax event="change" render="mensagem-medico-login medico-login" execute="medico-login"  
                    listener="#{medicoBean.comparaLoginListener}" />  
            </p:inputText>  
            <p:message id="mensagem-medico-login" for="medico-login" />

Vlw!!!

6 Respostas

D

falta atualizar o p:message

Tente assim :

<p:inputText id="medico-login" required="true" value="#{medicoBean.medico.login}" update="mensagem-medico-login">

Outro teste

<f:ajax event="change" render="mensagem-medico-login,medico-login" execute="medico-login">   // acho que tem um virgula separando os componentes e não sei se está correto esse execute ...
G

Nao tenho certeza do que vou falar, mas imagino que o erro aconteça pq ele procura pelo elemento com ID ‘mensagem-medico-login’ e não encontra, pois qnd a tela foi renderizada esse erro ainda não existia.

O que eu aconselho você fazer é colocar o p:message dentro de outro elemento, sempre visível, e mandar rerenderiza-lo. Algo como:

<h:outputText value="Login: " for="medico-login" />         
    <p:inputText id="medico-login" required="true" value="#{medicoBean.medico.login}">  
         <f:ajax event="change" render="areaRerender medico-login" execute="medico-login"  
                listener="#{medicoBean.comparaLoginListener}" />  
     </p:inputText>
     <h:outputText id="areaRerender">
          <p:message id="mensagem-medico-login" for="medico-login" />
     </h:outputText>

Nao sei se ira funcionar ocm h:outputText tbm. Procure por algo que funcione, faça uns testes.

A

Pessoal, ainda não funcionou.

Dei uma lida no artigo abaixo que me ajudou muito, mas ainda não está funcionando.
Alguém sabe o que estou fazendo de errado?

Página

<h:outputText value="Login: " for="medico-login" />
		<p:inputText id="medico-login" required="true"
			value="#{medicoBean.medico.login}">
			<f:ajax event="change" render="medico-login mensagem-medico-login"
				execute="medico-login" listener="#{medicoBean.comparaLoginListener}" />
		</p:inputText>
		  
		<p:message id="mensagem-medico-login" for="medico-login" />

Bean

public void comparaLoginListener() {
		if (medico.getLogin() != null
				&& !medico.getLogin().equals("")
				&& ServiceFactory.getInstance().getMedicoService()
						.findByLogin(medico.getLogin()) != null) {
									 
			 FacesContext fc = FacesContext.getCurrentInstance();
			 fc.addMessage("mensagem-medico-login", MessageFactory.getMessage("prontuario.faces.LoginExistente"));

			medico.setLogin("");
		}

	}

Properties

prontuario.faces.LoginExistente = Já existe um usuário com este login.

faces-config.xml

<application>
		<message-bundle>resources.Messages</message-bundle>
	</application>
A

Alguém???

A

Ninguém nunca teve esse problema???

A

Mudei a estratégia para utilizar validator. a mensagem só aparece quando eu envio o formulário e não quando eu saio do campo. Foi a forma que achei.
Segue o link: http://www.guj.com.br/java/71718-jsf---validator-resolvido

Porém não criei uma mensagem no código, utilizei a mensagem do meu arquivo de mensagens como o código abaixo.

context.addMessage(toValidate.getClientId(context), MessageFactory.getMessage("prontuario.faces.LoginExistente"));
Criado 5 de outubro de 2011
Ultima resposta 10 de out. de 2011
Respostas 6
Participantes 3