Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Mensagem global não aparece

Boa tarde,

No meu caso a mensagem global não está aparecendo quando digito dados incorretos (usuário e senha inválidos).

Segue minha view:

<?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://xmlns.jcp.org/jsf/html"
    xmlns:f="http://xmlns.jcp.org/jsf/core"
    xmlns:p="http://primefaces.org/ui"
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets">

<ui:composition template="_template.xhtml">

    <ui:define name="titulo"> 
        Login 
    </ui:define>

    <ui:define name="conteudo">

        <p:messages globalOnly="true"/>

        <h:form id="login">    
            <p:fieldset legend="Login">
                <h:panelGrid columns="3">

                    <p:outputLabel value="Email:" for="email" />
                    <p:inputText id="email" value="#{loginBean.usuario.email}" required="true" >
                        <f:passThroughAttribute name="type" value="email"/>
                    </p:inputText>
                    <p:messages for="email" id="messageEmail" />


                    <p:outputLabel value="Senha:" for="senha" />
                    <p:password id="senha" value="#{loginBean.usuario.senha}" feedback="true" required="true"/>
                    <p:messages for="senha" id="messagePassword"/>

                    <p:commandButton value="Login" action="#{loginBean.efetuarLogin}" update="@form" process="@form"/>
                </h:panelGrid>
            </p:fieldset>
        </h:form>

    </ui:define>
</ui:composition>

</html>
4 respostas

Opa, para ajudar precisamos ver o código seu managedbean que está adicionando as mensagens no escopo global.

Boa noite.

Segue código do ManagedBean:

package br.com.caelum.livraria.bean;


import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

import br.com.caelum.livraria.dao.UsuarioDAO;
import br.com.caelum.livraria.modelo.Usuario;


@ManagedBean
@ViewScoped
public class LoginBean {

    private Usuario usuario = new Usuario();

    public Usuario getUsuario() {
        return usuario;
    }

    public String efetuarLogin(){
        FacesContext context = FacesContext.getCurrentInstance();
        System.out.println("Fazendo login do usuário!" + this.usuario.getEmail());

        boolean usuarioExiste = new UsuarioDAO().usuarioExiste(this.usuario);

        if (usuarioExiste){

            context.getExternalContext().getFlash().setKeepMessages(true);
            context.getExternalContext().getSessionMap().put("usuarioLogado", this.usuario);

            return "livro?faces-redirect=true";
        }

        context.addMessage(null, new FacesMessage("Usuário não encontrado."));
        return "login?faces-redirect=true";
    }

    public String efetuarLogout(){
        FacesContext context = FacesContext.getCurrentInstance();
        context.getExternalContext().getSessionMap().remove("usuarioLogado");
        return "login?faces-redirect=true";
    }
}
solução!

Esequiel para a sua mensagem global aparecer você precisa do metodo setKeepMessages da Classe FacesContext. Fazendo mais ou menos assim.

        context.getExternalContext().getFlash().setKeepMessages(true);
 context.addMessage(null, new FacesMessage("Usuário não encontrado."));
        return "login?faces-redirect=true";

Obrigado Alisson!

Realmente ele não fazia isso caso o usuário não fosse encontrado.

Ele só fazia dentro do if (usuarioExiste).

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software