Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Não consegui injetar o FacesContext no Autorizador

Tentei injetar o FacesContext no Autorizador mas tá dando nullpointer já quando chamo a tela de login.

package br.com.caelum.livraria.util;

import java.io.Serializable;

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 javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;

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

@Named
@ViewScoped
public class Autorizador implements PhaseListener, Serializable {

    private static final String CAMINHO_PAGINA_LOGIN = "/login.xhtml";

    private static final long serialVersionUID = -7243482575488562717L;

    @Inject
    private FacesContext contexto;

    @Override
    public void afterPhase(PhaseEvent evento) {
        // Validaremos aqui para utilizar a árvore já restaurada

        String nomeDaPaginaAtual = contexto.getViewRoot().getViewId();
        System.out.println("Acessando página: " + nomeDaPaginaAtual);

        // Se for a tela de login, pode passar
        if (CAMINHO_PAGINA_LOGIN.equals(nomeDaPaginaAtual)) {
            return;
        }

        Usuario usuarioLogado = (Usuario) contexto.getExternalContext().getSessionMap().get(Constantes.USUARIO_LOGADO);

        if (usuarioLogado == null) {
            // Usuário não autenticado. Retornar para o login...
            NavigationHandler handler = contexto.getApplication().getNavigationHandler();
            handler.handleNavigation(contexto, null, "/login?faces-redirect=true");
            contexto.renderResponse();
        }

        // Usuário autenticado. Segue o jogo!
    }

    @Override
    public void beforePhase(PhaseEvent arg0) {
    }

    @Override
    public PhaseId getPhaseId() {
        // Faremos a validação logo na primeira fase
        return PhaseId.RESTORE_VIEW;
    }

}


GRAVE: Servlet.service() for servlet [Faces Servlet] in context with path [/livraria] threw exception [null] with root cause
java.lang.NullPointerException
    at br.com.caelum.livraria.util.Autorizador.afterPhase(Autorizador.java:31)
    at com.sun.faces.lifecycle.Phase.handleAfterPhase(Phase.java:189)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:107)
    at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:123)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:658)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
4 respostas

Oi Paulo,

pelo que me lembro isso só funciona com um Producer do CDI. Você criou esse Procuder?

Sem ele precisa usar:

FacesContext context = evento.getFacesContext();   

abs

Sim. Foi criado. Na verdade, é o mesmo que é utilizado pelos outros beans.

package br.com.caelum.livraria.util;

import javax.enterprise.context.RequestScoped;
import javax.enterprise.inject.Produces;
import javax.faces.context.FacesContext;

public class JSFUtil {

    @Produces
    @RequestScoped
    public FacesContext getFacesContext() {
        return FacesContext.getCurrentInstance();
    }
}

Da outra vez que deu esse null pointer, eu estava usando um objeto ainda não inicializado por causa do ciclo de vida do JSF.

Será que nesse método afterPhase do PhaseListener já está tudo inicializado?

Abraço,

Reutilizei o mesmo código postado no início da dúvida e agora está funcionando. Pode ter sido alguma sujeira de redeploy sei lá. Agradeço pela atenção.

solução

Oi Paulo,

otimo então e na duvida é sempre bom limpar e reiniciar :)

abs, Nico