estou tentando tratar essa Excetion ViewExpiredException mais não estou conseguindo.
package com.irmaosuspension.controleservico.jsf;
import javax.faces.context.ExceptionHandler;
import javax.faces.context.ExceptionHandlerFactory;
/**
* Fabrica de Exceção do JSF
* @author dayso
*
*/
public class JsfExceptionHandleFacotry extends ExceptionHandlerFactory{
private ExceptionHandlerFactory factory;
public JsfExceptionHandleFacotry(ExceptionHandlerFactory factory) {
this.factory = factory;
}
@Override
public ExceptionHandler getExceptionHandler() {
return new JsfExceptionHandler(factory.getExceptionHandler());
}
}
package com.irmaosuspension.controleservico.jsf;
import java.io.IOException;
import java.util.Iterator;
import javax.faces.FacesException;
import javax.faces.application.ViewExpiredException;
import javax.faces.context.ExceptionHandler;
import javax.faces.context.ExceptionHandlerWrapper;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.ExceptionQueuedEvent;
import javax.faces.event.ExceptionQueuedEventContext;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.omnifaces.util.Messages;
import com.irmaosuspension.controleservico.util.NegocioException;
/**
- Classe tratador de Exceções
- @author dayso
*/
public class JsfExceptionHandler extends ExceptionHandlerWrapper {
private static Log log = LogFactory.getLog(JsfExceptionHandler.class); //Regista os logs para essa classe.
private ExceptionHandler handler;
public JsfExceptionHandler(ExceptionHandler exceptionHandler) {
this.handler = exceptionHandler;
}
/**
* Método que retorna um tratador de Exceção Enpacotado
*/
@Override
public ExceptionHandler getWrapped() {
return this.handler;
}
/**
* Método que é chamado quando existir uma Exceção
*/
@Override
public void handle() throws FacesException {
// Vai iterar nas Exceções Ocorridas.
Iterator<ExceptionQueuedEvent> events = getHandledExceptionQueuedEvents().iterator();
while (events.hasNext()) {
ExceptionQueuedEvent event = events.next(); // pega o proximo eventos.
ExceptionQueuedEventContext context = (ExceptionQueuedEventContext) event.getSource(); // Pega a origem da Exceção.
Throwable exception = context.getException(); // pega a exceção de qualquer tipo..
NegocioException negocioException = getNegocioException(exception);
boolean handled = false;
try{
// Pego o Erro.
if (exception instanceof ViewExpiredException) { // se o erro é deste tipo, redireciona para a pagina principal.
handled = true;
redirect("/");
}else if (negocioException != null) { //se é de outro tipo mostra msg.
handled = true;
Messages.addGlobalError(negocioException.getMessage());
}else{ //Se não conhece um erro direciona para essa.
handled = true;
log.error("Erro de sistema: " + exception.getMessage(), exception); //imprimi toda a pilha do erro da exceção do arquivo de log.
redirect("/erro.xhtml");
}
}finally {
if (handled){
events.remove(); //REMOVE O do iterador
}
}
}
getWrapped().handle();
}
private NegocioException getNegocioException(Throwable exception) {
if (exception instanceof NegocioException) {
return (NegocioException) exception;
} else if (exception.getCause() != null) {
return getNegocioException(exception.getCause());
}
return null;
}
private void redirect(String page) {
try {
FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = facesContext.getExternalContext();
String contextPath = externalContext.getRequestContextPath();
externalContext.redirect(contextPath + page);
facesContext.responseComplete();
} catch (IOException e) {
throw new FacesException(e);
}
}
}
faces-config
<?xml version="1.0" encoding="UTF-8"?><factory>
<exception-handler-factory>com.irmaosuspension.controleservico.jsf.JsfExceptionHandleFacotry</exception-handler-factory>
</factory>