ErrorPageManager経由で例外のPageに遷移したときに、発生したExceptionをインジェクトできるようにする。(sugaさんのご要望に応える)
まずこの件は明らかにバグなので
瞬殺で修正しました。
で、次の件(エラー画面にスタックトレースを出したい)なんですが、
これはPageクラスに普通にExceptionがインジェクションできたほうが良いだろうと
いうことで、そのように修正しておきました。
こんな感じになります。
/** * スタックトレースを表示するためのページクラス。 * * @author suga */ public class ErrorResultPage { private static final String SERVLET_NAME = "javax.faces.webapp.FacesServlet"; private FacesContext context; private String stackTrace; private Exception exception; public String prerender() { stackTrace = buildStackTrace(exception); return null; } protected String buildStackTrace(Throwable t) { if (t == null) { return ""; } final StringBuffer buf = new StringBuffer(); buf.append("<div style=\"font-size: x-small;" + " font-family: monospace;\">"); Throwable current = t; do { buf.append("<span style=\"color: red;\">"); buf.append(current.toString()); buf.append("</span><br/>"); final StackTraceElement[] traces = current.getStackTrace(); for (int i = 0; i < traces.length; i++) { final StackTraceElement elm = traces[i]; if (elm.getClassName().startsWith(SERVLET_NAME)) { // Servlet より前は不要 break; } buf.append(" at "); buf.append(elm.getClassName()); buf.append("#"); buf.append(elm.getMethodName()); buf.append(" ("); buf.append(elm.getFileName()); buf.append(lineString(elm.getLineNumber())); buf.append(")<br/>"); } buf.append("<br/>"); } while ((current = current.getCause()) != null); buf.append("</div>"); return buf.toString(); } protected String lineString(int lineNumber) { if (lineNumber >= 0) { return "#" + Integer.toString(lineNumber); } return ""; } public FacesContext getFacesContext() { return context; } public void setFacesContext(FacesContext context) { this.context = context; } public String getStackTrace() { return stackTrace; } public void setStackTrace(String stackTace) { this.stackTrace = stackTace; } public Exception getException() { return exception; } public void setException(Exception exception) { this.exception = exception; } }
別になんてことないですが。
プロパティ名はexceptionで固定ですが、そこは実益重視で。
sugaさん、どうもありがとうございました。