Redirecionar para página de erro a partir do Filter

Olá pessoal,

Estou com um problema, preciso que o Filter redirecione para uma página de erro quando ocorrer uma exceção. Peguei um exemplo na NET (linhas em negrito), mas não funcionou.

Alguem sabe como resolver?

Vlw

	public void doFilter(ServletRequest req, ServletResponse res,
			FilterChain fc) throws IOException, ServletException, FacesException {
		   
[b]	    HttpServletRequest hreq = (HttpServletRequest) req;   
	    HttpServletResponse resp = (HttpServletResponse) res;  [/b]
		
		HibernateUtil.beginTransaction();
		
		try{
			fc.doFilter(req, res);
			HibernateUtil.commitTransaction();
		}catch (Exception e) {			
			HibernateUtil.rollbackTransaction();
[b]			resp.sendRedirect("erro.jsf");[/b]
			throw new ServletException(e);
		}finally{
			HibernateUtil.closeSession();
		}			
		
	}

Já tentou sem o "throw new ServletException(e); " ?

Sim!

Está no código.

Tentei também configurar uma pagina de erro no web.xml, mas esta parecendo esse erro:
java.lang.IllegalStateException: Cannot reset buffer after response has been committed

Faça no seu faces-config.xml

[code]
*

    <navigation-case>
        <from-outcome>errorPage</from-outcome>
        <to-view-id>/Erro.jsf</to-view-id>
    </navigation-case>

[/code]

Isso fará com que da String “errorPage” uma regra de navegação universal para a página de erro

No seu filter, tente:

NavigationHandler nh = facesContext.getApplication().getNavigationHandler(); nh.handleNavigation(facesContext, null, "errorPage");

Isso irá redirecionar para a página de erro. Caso contrário, pode tentar apenas a linha debaixo que tambem funcionará (pelo menos pra mim funciona).

FacesContext.getCurrentInstance().getExternalContext().redirect("/Erro.jsf");

Não funcionou apareceu a seguinte mensgem:

11:21:25,601 ERROR [[Faces Servlet]] Servlet.service() for servlet Faces Servlet threw exception
java.lang.NullPointerException
	at br.com.lpc.ganymede.util.HibernateSessionfilter.doFilter(HibernateSessionfilter.java:30)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:235)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:190)
	at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:92)
	at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:126)
	at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:828)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:601)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
	at java.lang.Thread.run(Unknown Source)

Meu Filter esta assim:

import java.io.IOException;
import javax.faces.FacesException;
import javax.faces.application.NavigationHandler;
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;

public class HibernateSessionfilter implements Filter{
	FacesContext facesContext;
	@Override
	public void destroy() {
		
	}
	
	@Override
	public void doFilter(ServletRequest req, ServletResponse res,
			FilterChain fc) throws IOException, ServletException, FacesException {
			
		try{
			HibernateUtil.beginTransaction();
			fc.doFilter(req, res);
			HibernateUtil.commitTransaction();
		}catch (Exception e) {
			NavigationHandler nh = facesContext.getApplication().getNavigationHandler();  
			nh.handleNavigation(facesContext, null, "errorPage");  			
			HibernateUtil.rollbackTransaction();
		    throw new ServletException(e);
		}finally{
			HibernateUtil.closeSession();
		}
	}
	
	@Override
	public void init(FilterConfig arg0) throws ServletException {
	
	}
	
}

O Faces.config

....

	<navigation-rule>
		<from-view-id>*</from-view-id>

		<navigation-case>
			<from-outcome>errorPage</from-outcome>
			<to-view-id>/erro.jsf</to-view-id>
		</navigation-case>
	</navigation-rule>

[quote=apalmeira]Sim!

Está no código.

Tentei também configurar uma pagina de erro no web.xml, mas esta parecendo esse erro:
java.lang.IllegalStateException: Cannot reset buffer after response has been committed[/quote]

Vc não tirou o resp.sendRedirect, por isso deu esse erro.

Ele redireciona sozinho, não precisa fazer nada. No caso do JSF eu faço um tratamento a mais quando o JSFContext expira:


    <!-- paginas de erro -->
	<context-param>
	  <param-name>org.apache.myfaces.ERROR_HANDLING</param-name>
	  <param-value>false</param-value>
	</context-param>
	<error-page>
	   <exception-type>javax.faces.application.ViewExpiredException</exception-type>
	   <location>/expiredPage.jsp</location>
	</error-page>
	<error-page>
	    <error-code>404</error-code>
	    <location>/errors/404.html</location>
	</error-page>
	<error-page>
	    <error-code>500</error-code>
	    <location>/errors/500.jsp</location>
	</error-page>

Devo remover a linha fc.doFilter(req, res); ?

Vlw

boaglio,

Entendi o que você disse, foi referente ao primeiro post.

vou testar!

Obrigado!!!

boaglio,

Comentei a linha, agora está aparecendo esse erro.

14:00:31,786 ERROR [[localhost]] Exception Processing ErrorPage[exceptionType=javax.servlet.ServletException, location=/erro.jsf]
java.lang.IllegalStateException: Cannot reset buffer after response has been committed
	at org.apache.catalina.connector.Response.resetBuffer(Response.java:684)
	at org.apache.catalina.connector.Response.resetBuffer(Response.java:705)
	at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:409)
	at org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:270)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:828)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:601)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
	at java.lang.Thread.run(Unknown Source)

Comentou a linha resp.sendRedirect(“erro.jsf”); ?

Isso!

Acho que você não comentou, pois o erro ainda indica: location=/erro.jsf

Pode ser cache, experimente limpar os diretórios log, temp, work do tomcat/jboss e teste novamente.

boaglio,

Fiz todos os procedimentos, mas nao resolveu!

Será que o location=/erro.jsf não é por causa do web.xml?

 <error-page>
  <exception-type>javax.faces.application.ViewExpiredException</exception-type>
  <location>/erro.jsf</location>
 </error-page>
 <error-page>
  <error-code>404</error-code>
  <location>/erro.jsf</location>
 </error-page>
 <error-page>
  <error-code>500</error-code>
  <location>/erro.jsf</location>
 </error-page>
 <error-page>
  <exception-type>javax.servlet.ServletException</exception-type>
  <location>/erro.jsf</location>
 </error-page>

Meu filter esta assim:

public class HibernateSessionfilter implements Filter {
	@Override
	public void destroy() {

	}
	
	public void doFilter(ServletRequest req, ServletResponse res, FilterChain fc)
			throws IOException, ServletException, FacesException {

		try {
			HibernateUtil.beginTransaction();			
			fc.doFilter(req, res);
			HibernateUtil.commitTransaction();
		} catch (Exception e) {
			HibernateUtil.rollbackTransaction();
			throw new ServletException(e);
		} finally {
			HibernateUtil.closeSession();
		}
	}
	
	@Override
	public void init(FilterConfig arg0) throws ServletException {

	}
}

[quote=apalmeira]boaglio,
Será que o location=/erro.jsf não é por causa do web.xml?
[/quote]

Sim, é isso, troque por .jsp ou html.

Essas páginas de erro não podem ter componentes JSF.

Não funcionou!

Você sabe o que isso quer dizer: java.lang.IllegalStateException: Cannot reset buffer after response has been committed

17:11:48,598 ERROR [[localhost]] Exception Processing ErrorPage[exceptionType=javax.servlet.ServletException, location=/erro.html]
java.lang.IllegalStateException: Cannot reset buffer after response has been committed
	at org.apache.catalina.connector.Response.resetBuffer(Response.java:684)
	at org.apache.catalina.connector.Response.resetBuffer(Response.java:705)
	at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:409)
	at org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:270)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:828)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:601)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
	at java.lang.Thread.run(Unknown Source)

[quote=boaglio][quote=apalmeira]Sim!

Está no código.

Tentei também configurar uma pagina de erro no web.xml, mas esta parecendo esse erro:
java.lang.IllegalStateException: Cannot reset buffer after response has been committed[/quote]

Vc não tirou o resp.sendRedirect, por isso deu esse erro.

Ele redireciona sozinho, não precisa fazer nada. No caso do JSF eu faço um tratamento a mais quando o JSFContext expira:


    <!-- paginas de erro -->
	<context-param>
	  <param-name>org.apache.myfaces.ERROR_HANDLING</param-name>
	  <param-value>false</param-value>
	</context-param>
	<error-page>
	   <exception-type>javax.faces.application.ViewExpiredException</exception-type>
	   <location>/expiredPage.jsp</location>
	</error-page>
	<error-page>
	    <error-code>404</error-code>
	    <location>/errors/404.html</location>
	</error-page>
	<error-page>
	    <error-code>500</error-code>
	    <location>/errors/500.jsp</location>
	</error-page>

[/quote]

Boa tarde!!

Você sabe me informar se esse redirecionamento direto no web.xml pode ser feito tambem no JSF 1.2??

Pois eu gostaria que se por algum motivo fosse lancada uma Exceção na minha aplicação fosse feito o redirecionamento para uma pagina. Meu web.xml esta assim

<context-param>   
  	<param-name>org.apache.myfaces.ERROR_HANDLING</param-name>   
  	<param-value>false</param-value>   
 </context-param>   
 <error-page>   
	<exception-type>javax.faces.application.ViewExpiredException</exception-type>   
   	<location>/login.jsf</location>   
 </error-page>   
 <error-page>   
   	<error-code>404</error-code>   
   	<location>/errorpage.jsp</location>   
 </error-page>   
 <error-page>   
   	<error-code>500</error-code>   
   	<location>/errorpage.jsp</location>   
 </error-page> 
 <error-page>   
	<exception-type>javax.servlet.ServletException</exception-type>   
	<location>/errorpage.jsp</location>   
 </error-page>  

com esse trecho no meu web.xml o stackTrace não é mais exibido no navegador, porem a pagina exibida é a pagina de erro do navegador e não a especificada no meu web.xml…

Obrigado…