23.4.4. HTTP 応答への例外のマップ
JAX-RS 仕様の 3.3.4 項では、JAX RS がチェック例外と非チェック例外を処理する方法について定義しています。Seam と RESTEasy を統合することで、Seam の
pages.xml 内の HTTP 応答コードに例外をマップすることが可能です。pages.xml をすでに使用している場合は、これは多くの JAX RS 例外のマッパークラスよりも維持し易いです。
Seam 内で処理される例外については、Seam フィルタは HTTP 要求に対し実行する必要があります。REST 要求を扱わない要求 URI パターンとして ではなく、
web.xml のすべての要求をフィルタする必要があります。次のサンプルはすべての HTTP 要求をインターセプトし、Seam 例外処理を有効にします。
リソースメソッドで投げられた非チェック例外
UnsupportedOperationException を 501 Not Implemented HTTP ステータス応答に変換するには、次を pages.xml 記述子に追加します。
<exception class="java.lang.UnsupportedOperationException">
<http-error error-code="501">
<message>The requested operation is not supported</message>
</http-error>
</exception>
<exception class="java.lang.UnsupportedOperationException">
<http-error error-code="501">
<message>The requested operation is not supported</message>
</http-error>
</exception>
カスタム例外またはチェック例外は同じように処理されます。
<exception class="my.CustomException" log="false">
<http-error error-code="503">
<message>Service not available: #{org.jboss.seam.handledException.message}</message>
</http-error>
</exception>
<exception class="my.CustomException" log="false">
<http-error error-code="503">
<message>Service not available: #{org.jboss.seam.handledException.message}</message>
</http-error>
</exception>
例外が発生した場合 HTTP エラーをクライアントに送る必要はありません。Seam により リダイレクトとして例外を Seam アプリケーションのビューにマップすることが可能です。この機能は通常、REST API リモートクライアントではなく人間のクライアント (Web ブラウザ) に対して使用されるため、
pages.xml の競合する例外マッピングに注意する必要があります。
HTTP レスポンスはサーブレットコンテナを通るため、
web.xml 設定に <error-page> マッピングがある場合は、追加のマッピングを適用することが可能です。次に HTTP ステータスコードは 200 OK のステータスを持つレンダリングされた HTML エラーページにマップされます。