7.12.4. 例外処理に対する XML の使用
すべての例外クラスにアノテーションを付加することは不可能なので、 Seam ではこの機能を
pages.xml でも指定できるようにしています。
<pages>
<exception class="javax.persistence.EntityNotFoundException">
<http-error error-code="404"/>
</exception>
<exception class="javax.persistence.PersistenceException">
<end-conversation/>
<redirect view-id="/error.xhtml">
<message>Database access failed</message>
</redirect>
</exception>
<exception>
<end-conversation/>
<redirect view-id="/error.xhtml">
<message>Unexpected failure</message>
</redirect>
</exception>
</pages>
最後の
<exception> 宣言はクラスを指定していないので、 アノテーションまたは pages.xml で指定された処理なしですべての例外に対してキャッチオールで動作します。
EL を使ってリダイレクト先の
view-id を指定することもできます。
EL によって処理された例外インスタンスにアクセスすることもできます。 Seam はそれを対話コンテキストに置きます。 たとえば、 例外のメッセージにアクセスするには次のようにします。
...
throw new AuthorizationException("You are not allowed to do this!");
<pages>
<exception class="org.jboss.seam.security.AuthorizationException">
<end-conversation/>
<redirect view-id="/error.xhtml">
<message severity="WARN">
#{org.jboss.seam.handledException.message}
</message>
</redirect>
</exception>
</pages>
org.jboss.seam.handledException は例外ハンドラによって処理されたネストした例外を保持します。 その最も外側の (ラッパーの) 例外は org.jboss.seam.caughtException によって取得可能です。
7.12.4.1. 例外のロギングの抑制 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
pages.xml で定義されている例外ハンドラの場合、 例外がログ記録されるレベルを指定したり、 例外のログ記録を全て抑制することが可能です。 log および log-level の各属性を使用して例外のロギングを制御します。 以下に示すように、 log="false" が設定されている場合に指定された例外が発生するとログメッセージは生成されません。
<exception class="org.jboss.seam.security.NotLoggedInException"
log="false">
<redirect view-id="/register.xhtml">
<message severity="warn">
You must be a member to use this feature
</message>
</redirect>
</exception>
log 属性を指定しないとデフォルトでは true に設定されます。 つまり例外はログ記録されます。 代わりに log-level を指定して例外がログ記録されるレベルを制御することができます。
<exception class="org.jboss.seam.security.NotLoggedInException"
log-level="info">
<redirect view-id="/register.xhtml">
<message severity="warn">
You must be a member to use this feature
</message>
</redirect>
</exception>
log-level に指定できる値は、 fatal、 error、 warn、 info、 debug、 trace です。 log-level を指定しない、または無効な値を設定した場合は、 log-level はデフォルトで error に設定されます。