17.1.8 例外ハンドリング
JAX-RSエンジンは,次に示す個所からスローされる例外をここで説明するようにハンドリングします。
-
リソースメソッド
-
サブリソースメソッド
-
サブリソースロケータ
-
ルートリソースクラスのコンストラクタおよびサブリソースクラス
- 〈この項の構成〉
(1) WebApplicationException(例外マッピングプロバイダがない場合)
WebApplicationExceptionがスローされる場合で,WebApplicationExceptionまたはその親以上の例外に対応する例外マッピングプロバイダがないとき,JAX-RSエンジンは次の表に示すようにWebApplicationExceptionをハンドリングします。
項番 |
条件 |
ハンドリング結果 |
||
---|---|---|---|---|
responseプロパティ |
responseプロパティのHTTPステータスコード |
HTTPレスポンスのHTTPステータスコード |
メッセージID |
|
1 |
設定されている |
|
WebApplicationExceptionのresponseプロパティが持つ値が使用されます。 |
KDJJ30021-I |
2 |
設定されている |
|
WebApplicationExceptionのresponseプロパティが持つ値が使用されます。 |
KDJJ30022-I |
3 |
設定されている |
|
WebApplicationExceptionのresponseプロパティが持つ値が使用されます。 |
KDJJ10018-E |
4 |
設定されている |
|
WebApplicationExceptionのresponseプロパティが持つ値が使用されます。 |
KDJJ10019-E |
5 |
設定されていない |
− |
500 |
KDJJ10018-E |
WebApplicationExceptionを生成し,responseプロパティを設定する例を次に示します。
package com.sample.resources; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.ResponseBuilder; //ルートリソースクラス @Path("/root") public class Resource { //サブリソースメソッド @Path("/subresourcemethod") @GET public String subResourceMethod() { //ResponseBuilderを使用してResponseインスタンスを生成 ResponseBuilder rb = Response.status(208). entity("entity for WebApplicationException"); //WebApplicationExceptionへResponseインスタンスを設定 throw new WebApplicationException(rb.build()); } }
この例では,ルートリソースクラスcom.sample.resources.Resourceを含むWebアプリケーション(WARファイル)のコンテキストルートが"resource"で,Webアプリケーションが"example.com"というホストで公開されているとします。その場合,URL"http://example.com/resource/root/subresourcemethod"に対するHTTP GETリクエストは,メソッドsubResourceMethod()にディスパッチされます。また,HTTPレスポンスは,WebApplicationExceptionのresponseプロパティから変換されます。
(2) その他の例外(例外マッピングプロバイダがない場合)
WebApplicationException以外の例外がスローされる場合で,その例外またはその親以上の例外に対応する例外マッピングプロバイダがないとき,JAX-RSエンジンは次の表に示すようにその例外をハンドリングします。
項番 |
条件 |
ハンドリングの結果 |
||
---|---|---|---|---|
例外の種類 |
JAX-RSエンジンの動作 |
HTTPレスポンスのHTTPステータスコード |
メッセージID |
|
1 |
ランタイム例外 |
そのランタイム例外をスローし直します。 |
500 |
KDJJ10010-E, KDJJ10039-E |
2 |
上記以外 |
RuntimeExceptionでその例外をラップしてスローします |
500 |
KDJJ10017-E, KDJJ10039-E |
(3) 例外マッピングプロバイダがある場合
スローされる例外,またはその親以上の例外に対応する例外マッピングプロバイダがある場合は,例外マッピングプロバイダの動作に依存します。なお,スローされる例外とその親以上の例外に対応する例外マッピングプロバイダが複数存在する場合は,その例外に最も近い例外(スローされた例外を含む)を処理できる例外マッピングプロバイダが動作します。