Autenticação com PhaseListener

7 respostas
G

Olá, estava fazendo a parte de Login do meu sistema, quando fui implementar uma Autenticação com PhaseListener deu o seguinte erro:

Depois da Fase:RESTORE_VIEW 1
Depois da Fase:RESTORE_VIEW 1
mai 04, 2015 10:37:52 PM org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() for servlet [Faces Servlet] in context with path [/TesteTCC2] threw exception [null] with root cause
java.lang.NullPointerException
	at br.com.teste.tcc.listener.Autorizador.afterPhase(Autorizador.java:27)
	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:121)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:646)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:516)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1086)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:659)
	at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:223)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1558)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1515)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:745)

Aqui segue minha classe Autorizador

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.inject.Inject;

import br.com.teste.tcc.mb.UsuarioLogadoBean;

public class Autorizador implements PhaseListener {
	
	private static final long serialVersionUID = 1L;
	
	@Inject
	private UsuarioLogadoBean usuarioLogado;
	
	public void afterPhase(PhaseEvent event) {
		FacesContext context = event.getFacesContext();
		
		if("/login.xhtml".equals(context.getViewRoot().getViewId())){
			return;
		}
				
		//Usando o usuarioLogado que foi injetado //Verificação
		if(!usuarioLogado.isLogado()){
			NavigationHandler handler = context.getApplication().getNavigationHandler();
			
			handler.handleNavigation(context, null, "login?faces-redirect=true");
			
			//Efetua renderização da tela
			context.renderResponse();
		}
	}
	
	public void beforePhase(PhaseEvent event) {
		// TODO Auto-generated method stub
	}

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

}

Se alguém ai puder me dar um Help!

7 Respostas

I

Repare no erro:

java.lang.NullPointerException
at br.com.teste.tcc.listener.Autorizador.afterPhase(Autorizador.java:27)

se a linha 27 for essa:

Ou o context está vindo nulo (mais provável), ou o getApplication() do context. Dê uma depurada no código pra ver.

PS: Nunca usei isso, mas dando uma pesquisada rápida, vi que precisa adicionar o listener no seu faces-config.xml. Voce fez isso?

br.com.teste.tcc.listener.Autorizador
G

Boa tarde, adicionei sim no faces-config.xml

E a linha 27 é essa:

if(!usuarioLogado.isLogado()){
I

Hum, então está claro que o erro está na injeção de dependências…

UsuarioLogadoBean está anotado com @Named?

D

Posta a sua UsuarioLogadoBean

G

Boa noite amigos, está anotado com @Named sim.

segue a classe como solicitado:

package br.com.teste.tcc.mb;

import java.io.Serializable;

import javax.enterprise.context.SessionScoped;
import javax.inject.Named;

import br.com.teste.tcc.modelo.Usuario;

@Named 
@SessionScoped
public class UsuarioLogadoBean implements Serializable {
	
	private static final long serialVersionUID = 1L;
	
	private Usuario usuario;
	
	public void logar(Usuario usuario){
		this.usuario = usuario;
	}
	
	public void deslogar(){
		this.usuario = null;
	}
	
	public Usuario getUsuario(){
		return usuario;
	}
	
	public boolean isLogado(){
		return this.usuario != null;
	}
}
G

E é essa é a classe LoginBean

package br.com.teste.tcc.mb;

//import javax.faces.bean.ManagedBean;
//import javax.faces.bean.SessionScoped;
import java.io.Serializable;

import javax.enterprise.context.RequestScoped;
//import javax.enterprise.context.SessionScoped;
import javax.inject.Inject;
import javax.inject.Named;

import br.com.teste.tcc.dao.UsuarioDao;
import br.com.teste.tcc.modelo.Usuario;

//@SessionScoped
//@ManagedBean
//@SessionScoped
@Named
@RequestScoped
public class LoginBean implements Serializable {
	
	private static final long serialVersionUID = 1L; 
	
	@Inject
	private UsuarioLogadoBean usuarioLogado;
	
	@Inject
	private UsuarioDao dao;
	
	private Usuario usuario = new Usuario();
	
	public String efetuaLogin(){
		//UsuarioDao dao = new UsuarioDao();
		boolean loginValido = dao.existe(this.usuario);
		if(loginValido){
			usuarioLogado.logar(usuario);
			return "carro?faces-redirect=true";
		}else{
			usuarioLogado.deslogar();
			this.usuario = new Usuario();
			return "login";
		}
	}
	
	public Usuario getUsuario(){
		return this.usuario;
	}
}
J

Bom dia, estou com o mesmo problema…você conseguiu resolver?

Criado 5 de maio de 2015
Ultima resposta 5 de out. de 2015
Respostas 7
Participantes 4