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("&nbsp;&nbsp;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さん、どうもありがとうございました。