Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Phase Listener não executado

Mesmo tendo registrado o novo PhaseListener "Autorizador" no arquivo faces-config.xml o mesmo não foi executado! Fiz a mesma implementação de "afterPhase" no outro PhaseListener do projeto (LogPhaseListener) e a rotina rodou normalmente, redirecionando para a página de login caso não houvesse usuário na sessão. Seguem os códigos do PhaseListener e faces-confg.xml:

package br.com.caelum.livraria.util;

import javax.faces.application.NavigationHandler;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;

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

public class Autorizador implements PhaseListener {

    public static final String NOME_PAGINA_LOGIN = "/login.xhtml";
    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Override
    public void afterPhase(PhaseEvent event) {
        FacesContext context = event.getFacesContext();
        String nomePagina = context.getViewRoot().getViewId();

        if (NOME_PAGINA_LOGIN.equals(nomePagina)) {
            return;
        }
        Usuario usuarioLogado = (Usuario) context.getExternalContext().getSessionMap().get("usuarioLogado");

        if (usuarioLogado != null) {
            return;
        }

        NavigationHandler handler = context.getApplication().getNavigationHandler();

        handler.handleNavigation(context, null, "/login?faces-redirect=true");

        context.renderResponse();
    }

    @Override
    public void beforePhase(PhaseEvent event) {
    }

    @Override
    public PhaseId getPhaseId() {
        return null;
    }

}
<?xml version="1.0" encoding="UTF-8"?>
<faces-config version="2.2" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd">

    <lifecycle>
        <phase-listener>br.com.caelum.livraria.util.LogPhaseListener</phase-listener>
        <phase-listener>br.com.caelum.livraria.util.Autorizador</phase-listener>
    </lifecycle>

</faces-config>
1 resposta
solução!

Oi Cláudio,

Acho que o problema é que no seu método getPhaseId você está retornando null e com isso o JSF não sabe em qual fase deve chamar seu PhaseListener e acabo o ignorando.

Altere seu método para:

@Override
public PhaseId getPhaseId() {
  return PhaseId.RESTORE_VIEW;
}

Bons estudos!

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