[Resolvido]NullPointer em filtro web

Pessoal,

Tenho o seguinte problema, ao acessar o sistema web da empresa pela URL eh repassado quem esta tentando usar o servico (cliente/funcionario,etc) e/ou o aplicativo alvo. Com base nessas informacoes o sistema deve automaticamente redirecionar para a pagina correspondente do usuario ou do aplicativo. Minha primeira ideia foi utilizar um filtro na pagina inicial (index.xhtml) e apos a leitura dos parametros da URL mandar o visitante para a area correta, mas estou tendo problema de nullPointer ao persistir esses dados no meu bean de escopo session (esses dados podem ser utilizados em consultas sql no futuro), na verdade a excecao ocorre quando tento acessar o escopo externo da aplicacao. Segue abaixo o codigo, alguma ideia de que besteira possa estar fazendo?

package cardapioDigital.web;

import java.io.IOException;

import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpSession;

public class TesteBean implements Filter{

	private String clienteABR;
	private String aplicativoABR;	


	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void doFilter(ServletRequest req, ServletResponse resp,
			FilterChain chain) throws IOException, ServletException {
		System.out.println("To no Filtro");
		
		aplicativoABR = req.getParameter("aplicativo");
		clienteABR = req.getParameter("cliente");
		
		
		FacesContext context = FacesContext.getCurrentInstance();		
		ExternalContext external = context.getExternalContext();		//a excecao ocorre nesta linha
		HttpSession session = (HttpSession) external.getSession(true);
		ContextoBean contextoBean = (ContextoBean) session.getAttribute("contextoBean");
		
		contextoBean.setAplicativoABR(aplicativoABR);
		contextoBean.setClienteABR(clienteABR);
		
		chain.doFilter(req, resp);
		
		System.out.println("Sai do filtro");
		
	}

	@Override
	public void init(FilterConfig arg0) throws ServletException {
		// TODO Auto-generated method stub
		
	}
	
	
	
}

Bean

<managed-bean>
	<managed-bean-name>contextoBean</managed-bean-name>
	<managed-bean-class>cardapioDigital.web.ContextoBean</managed-bean-class>
	<managed-bean-scope>session</managed-bean-scope>
</managed-bean>	

Filtro no web.xml

<filter>
		<filter-name>paginaFilter</filter-name>
		<filter-class>cardapioDigital.web.TesteBean</filter-class>
</filter>
<filter-mapping>
		<filter-name>paginaFilter</filter-name>
		<url-pattern>/index.jsf</url-pattern>
</filter-mapping>

Teria como você colocar o erro?

Ele vai apontar em qual linha acontece o erro e ficará mais fácil de tratar.

Grave: Servlet.service() for servlet [Faces Servlet] in context with path [/cardapioDigital] threw exception [java.lang.NullPointerException] with root cause
java.lang.NullPointerException
	at cardapioDigital.web.TesteBean.doFilter(TesteBean.java:37)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at cardapioDigital.web.filter.ConexaoHibernateFilter.doFilter(ConexaoHibernateFilter.java:64)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:312)
	at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:116)
	at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:324)
	at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:324)
	at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:101)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:324)
	at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:324)
	at org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:139)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:324)
	at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:324)
	at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:324)
	at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:182)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:324)
	at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:324)
	at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:324)
	at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:174)
	at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237)
	at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:185)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:151)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:269)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)

Oq tem nessa linha? at cardapioDigital.web.TesteBean.doFilter(TesteBean.java:37)

FacesContext context = FacesContext.getCurrentInstance();         
ExternalContext external = context.getExternalContext();        //a excecao ocorre nesta linha 

O codigo do filtro tah lah no primeiro topico, vlw ai pelo help :slight_smile:

Opa, desculpe a volta.

Bem, dentro do filtro você ainda não tem acesso ao contexto JSF.

Para buscar a session você não precissa de buscar o FacesContext.

Basta utilizar o ServletRequest que você tem.

Seria algo parecido com:

HttpServletRequest request = (HttpServletRequest) req; HttpSession session = request.getSession();

Bom dia rauppluizfr

Se não me engano, dentro de um filter servlet, você não tem acesso ao contexto do JSF. (eu acho, me corrijam se estiver errado.)

Mas pelo que eu entendi, você precisa recuperar um objeto da sessão.

Uma altenativa seria pegar a sessão do proprio objeto request.

ex.

HttpSession session = ((HttpServletRequest) resq).getSession();

[]'s

EDITADO: jakefrog já tinha respondido … malz.

Lembre-se que você não pode simplemente pegar o FacesContext no filter:

FacesContext context = FacesContext.getCurrentInstance();  

Pelo que percebi você usou ele apenas para pegar o Session.
Não é necessário o FacesContext para isso, tenta assim:


HttpServletRequest httpServletRequest = (HttpServletRequest) req;
HttpSession session = httpServletRequest .getSession(true);  

– Editado
Vi agora que a galera ai em cima tinha respondido.

ayslanms, só uma dica.

Nesse método não é necessário passar o true, pois já é o valor default. [=

Valeu pessoal, resolveu o problema aqui!