Hitachi

Cosminexus V11 アプリケーションサーバ Webサービス開発ガイド


17.2.2 例外マッピングプロバイダ

例外マッピングプロバイダで処理できる例外からHTTPレスポンスへのマッピングをカスタマイズする場合は,例外マッピングプロバイダを実装してください。

例外マッピングプロバイダは,ExceptionMapper<T>インタフェースを実装し,Providerアノテーションでアノテートします。

例外マッピングプロバイダの例を次に示します。

package com.sample.providers;
 
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;
 
//RuntimeExceptionからHTTPレスポンスへのマッピングをカスタマイズする例外マッピングプロバイダ
@Provider
public class RuntimeExceptionMapper implements
    ExceptionMapper<RuntimeException> {
 
  public Response toResponse(RuntimeException runtimeException) {
    int httpStatus = 0;
    String entity = "";
    
    //ResponseBuilderクラスを使用してHTTPレスポンスを作成する
    return Response.status(httpStatus).entity(entity).build();
  }
}

この例では,プロバイダcom.sample.providers.RuntimeExceptionMapperが,例外マッピングプロバイダで,型パラメタにRuntimeExceptionを指定したExceptionMapperインタフェースを実装しています。ここでは,ResponseBuilderクラスのtoResponseメソッドを呼び出してHTTPレスポンスを作成しています。

なお,例外マッピングプロバイダは,一つの例外に対して一つだけ作成できます。一つの例外に対して二つ以上の例外マッピングプロバイダを作成すると,エラーになり(KDJJ10028-E,KDJJ10039-E),例外マッピングプロバイダはインスタンス化されません。HTTPステータスコードには500が返されます。

〈この項の構成〉

(1) コンストラクタ

例外マッピングプロバイダは,publicデフォルトコンストラクタ(明示的に宣言されないコンストラクタ)も含めて,少なくとも一つ以上のpublicコンストラクタを持つ必要があります。

publicコンストラクタが一つも宣言されていない場合,エラーとなり(KDJJ10002-E,KDJJ10006-E),例外マッピングプロバイダはインスタンス化されません。HTTPステータスコードには500が返されます。

次に示すコンストラクタはpublicコンストラクタではありません。

コンストラクタのパラメタでは,インジェクション用アノテーションとしてContextアノテーションを使用できます。Contextアノテーション以外のインジェクション用アノテーションが使用されている場合,エラーとなり(KDJJ10006-E),例外マッピングプロバイダはインスタンス化されません。HTTPステータスコードには500が返されます。使用できないインジェクション用アノテーションを次に示します。

これらのパラメタにインジェクション用アノテーション以外を指定した場合,エラーメッセージが出力されます(KDJJ10006-E)。HTTPステータスコードには500が返されます。

例外マッピングプロバイダがパラメタを持つpublicコンストラクタを一つ以上持つ場合,JAX-RSエンジンは,最もパラメタ数が多いコンストラクタを使用して例外マッピングプロバイダをインスタンス化します。最もパラメタ数が多いコンストラクタを二つ以上持つ場合,最初に定義されているコンストラクタを使用して例外マッピングプロバイダをインスタンス化します。このとき,警告メッセージがログに出力されます(KDJJ20011-W)。

例外マッピングプロバイダがインスタンス化されるときにランタイム例外が発生した場合,エラーとなります(KDJJ10028-E,KDJJ10039-E)。HTTPステータスコードには500が返されます。

(2) フィールドおよびbeanプロパティ

例外マッピングプロバイダのフィールドおよびbeanプロパティ上では,インジェクション用アノテーションとしてContextアノテーションを使用できます。

Contextアノテーション以外のインジェクション用アノテーションが使用されている場合,無視されます。使用できないアノテーションを次に示します。