Boa noite pessoal
Na minha aplicação, criei uma classe ExceptionHandler que direciona para uma página de erro quando ocorre uma exception.
public class ExceptionHandler extends ActionListenerImpl {
@Override
public void processAction(ActionEvent event) {
// Obtem o contexto JSF
FacesContext context = FacesContext.getCurrentInstance();
try {
// Executa o método da classe Pai
super.processAction(event);
} catch (Exception e) {
// Se ocorrer um erro inesperado, exibe a mensagem abaixo
context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_FATAL, e.getMessage(), null));
// Redireciona para a pagina com o mapeamento 'erro' no faces-config.
context.getApplication().getNavigationHandler().handleNavigation(
context, null, "erro");
}
}
}
inclui o trecho abaixo no meu faces-config para direcionar meu actionlistner:
<application>
<action-listener>sigaeweb.Conversores.ExceptionHandler</action-listener>
<view-handler>com.icesoft.faces.facelets.D2DFaceletViewHandler</view-handler>
<locale-config>
<default-locale>pt-br</default-locale>
<supported-locale>pt_br</supported-locale>
</locale-config>
<message-bundle>sigaeweb.Conversores.mensagens.Mensagens</message-bundle>
</application>
minha classe ErroFace
public class ErroFace extends Throwable{
private String msg;
public String getMsg() {
msg = null;
msg = GetStackTraceAsString.getStackTrace(this);
return msg;
}
public void setMsg(String Msg) {
this.msg = Msg;
}
}
meu conversor para retornar o stacktrace como string:
public class GetStackTraceAsString {
public static String getStackTrace(Throwable throwable) {
Writer writer = new StringWriter();
PrintWriter printWriter = new PrintWriter(writer);
throwable.printStackTrace(printWriter);
return writer.toString();
}
public static void main (String[]args){
final Throwable throwable = new IllegalArgumentException();
System.out.println(getStackTrace(throwable));
}
}
minha pagina de erro:
<jsp:root xmlns:ui="http://java.sun.com/jsf/facelets" version="2.1" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:ice="http://www.icesoft.com/icefaces/component">
<jsp:directive.page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"/>
<ice:outputDeclaration doctypeRoot="HTML" doctypePublic="-//W3C//DTD HTML 4.01 Transitional//EN" doctypeSystem="http://www.w3.org/TR/html4/loose.dtd" />
<f:view>
<html>
<head>
<title>SIGAE - erro</title>
</head>
<body bgcolor="#E6FEFF">
<h:form><br/><br/><br/>
<div style="font-family: Arial, Helvetica, sans-serif; font-size: 11pt;" align="center">Erro<br/><br/>
<ice:messages/>
<ice:commandButton value="principal" action="gotoMain"/><br/><br/>
<ice:outputText value="#{ErroFace.msg}"/>
</div>
</h:form>
</body>
</html>
</f:view>
</jsp:root>
A mensagem é exibida, e o stacktrace é traduzido para string, no entanto, o stacktrace apresentado não é o do erro original. O stacktrace apresentado refere-se sempre a classe sigaeweb.ManagedBeans.ErroFace
segue abaixo um trecho do stacktrace exibido na pagina de erro:
sigaeweb.ManagedBeans.ErroFace at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at java.lang.Class.newInstance0(Class.java:355)
at java.lang.Class.newInstance(Class.java:308)
at com.sun.faces.mgbean.BeanBuilder.newBeanInstance(BeanBuilder.java:185) ...