3.1 独自例外ページ作成方法
移転しました。
AndroMDA3.1 では独自例外ページを作成したためメモっておく。
本来ならモデル上で例外フローを書けばよいのだが、煩雑になり図も醜くなるためソース中で例外発生処理を書き、Strutsの機能を利用しそれを受け取るようにした。
Exception関連クラス作成
SystemException
例外クラス
public class SystemException extends RuntimeException{ private String errid; private String[] msgs; public String getErrid(){ return errid; } public String[] getMsgs(){ return msgs; } public SystemException(String pErrid){ super(pErrid); errid = pErrid; } public SystemException(String pErrid, String[] pMsgs){ super(pErrid); errid = pErrid; msgs = pMsgs; } public SystemException(String pErrid, String[] pMsgs, Throwable cause){ super(pErrid,cause); errid = pErrid; msgs = pMsgs; } public SystemException(String pErrid, String msg1){ this(pErrid, new String[]{msg1}); } public SystemException(String pErrid, String msg1, Throwable cause){ this(pErrid, new String[]{msg1}, cause); } }
SystemExceptionHandler
例外ハンドラー
public class SystemExceptionHandler extends ExceptionHandler{ public ActionForward execute( Exception ex, ExceptionConfig ae, ActionMapping mapping, ActionForm formInstance, HttpServletRequest request, HttpServletResponse response) throws ServletException { ActionForward forward = null; ActionMessage error = null; String property = null; // Build the forward from the exception mapping if it exists // or from the form input if (ae.getPath() != null) { forward = new ActionForward(ae.getPath()); } else { forward = mapping.getInputForward(); } // Figure out the error if (ex instanceof ModuleException) { error = ((ModuleException) ex).getActionMessage(); property = ((ModuleException) ex).getProperty(); } else if (ex instanceof SystemException) { error = new ActionMessage(((SystemException) ex).getErrid(), ((SystemException) ex).getMsgs()); property = error.getKey(); } else { error = new ActionMessage(ae.getKey(), ex.getMessage()); property = error.getKey(); } this.logException(ex); // Store the exception request.setAttribute(Globals.EXCEPTION_KEY, ex); this.storeException(request, property, error, forward, ae.getScope()); return forward; } }
設定ファイルとのマージ
WebMergeMappings.xml
各種設定ファイルとのマージファイル
: : <mapping> <from><![CDATA[<!-- global-exceptions merge point -->]]></from> <to> <![CDATA[ <exception type="hoge.exception.SystemException" path="/hoge/error-get-data.jsp" key="errors.system.getdata" handler="hoge.exception.SystemExceptionHandler" /> ]]> </to> </mapping> : : <mapping> <from><![CDATA[# custom-messages merge-point]]></from> <to> <path>../../../web/src/properties/custom-resources.properties</path> </to> </mapping> : :
表示
JSP
<%@ page contentType="text/html;charset=Shift_JIS" %> <%@ include file="/taglib-imports.jspf" %> <tiles:insert definition="main.layout"> <tiles:put name="style" type="string"> <link rel="stylesheet" type="text/css" media="screen" href="<html:rewrite page="/hoge/error-get-data.css"/>"></link> </tiles:put> <tiles:put name="body" type="string"> <div> <h1>不正な操作を行いました。</h1> </div> <div id="pageHelpSection"> <blockquote> </blockquote> </div> </tiles:put> </tiles:insert>
custom-resources.properties
メッセージプロパティファイル
errors.system.getdata=エラーが発生しました。
実装クラス
hoge.java
実際に例外を発生するクラス
// どこかの処理でthrow throw new SystemException("errors.system.getdata");