Tenho uma aplicação Web que utiliza Hibernate e minhas exceptions de banco (HibernateException) são tratadas no Servlet. Este a “empacota” em uma exceção criada por mim (WebCommandException) e lança para o FrontController. Este por sua vez dá um “throw” dentro de uma ServletException. O que acontece é que quando o Tomcat exibe o erro (não uso errorPage customizada) só aparece a mensagem da exception e não o stacktrace completo.
Segue mais ou menos o que estou fazendo no meu Servlet:
public void execute() throws WebCommandException {
try {
ProdutoDAO.save(produto);
} catch (HibernateException e) {
throw new WebCommandException(e);
}
}
o FrontController:
try {
command.execute();
} catch (WebCommandException e) {
throw new ServletException(e);
}
código de WebCommandException:
public class WebCommandException extends Exception {
public WebCommandException(Throwable e) {
super(e);
}
}
existe alguma forma de exibir todo o stacktrace na página ?
Após umas pesquisas no Google, consegui escrever uma solução que resolve este problema. Primeiro, criei uma classe que encapsula qualquer exception e retorna uma RuntimeException, sem perder o stacktrace. Depois é só deixar o Servlet lançar a exceção para o servidor e configurar uma errorPage default.
Segue o código da classe:
public class WebCommandException extends RuntimeException {
Throwable throwable;
private WebCommandException(Throwable t) {
this.throwable = t;
}
/** Wraps another exeception in a RuntimeException. */
public static RuntimeException wrap(Throwable t) {
if (t instanceof RuntimeException)
return (RuntimeException) t;
return new WebCommandException(t);
}
public Throwable getCause() {
return this.throwable;
}
public void printStackTrace() {
this.throwable.printStackTrace();
}
}
Método que lança a exceção:
try {
...
} catch (Exception e) {
throw WebCommandException.wrap(e);
}
Página de erro default (tem que configurar no web.xml):
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Erro
</title>
</head>
<body>
<h1>Página de erro</h1>
<h2>Ocorreu um erro fatal</h2>
<pre>
<%
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
exception.printStackTrace(pw);
out.print(sw);
sw.close();
pw.close();
%>
</pre>
</body>
</html>
Se alguém souber como fazer a página com JSTL me avise.