リソースの例外およびエラーに対する例外マッパーの定義

Java™ API for RESTful Web Services (JAX-RS) アプリケーションで例外およびエラーが発生する場合があります。 デフォルトの動作では、JavaServer Pages (JSP) エラー・ページなどのアプリケーション・コンテナーの例外処理機能が使用されます。しかし、エラー処理をカスタマイズすることで、例外またはエラーが発生した場合に特定の応答を返すようにすることができます。

このタスクについて

JAX-RS リソース・メソッドは、他の Java メソッドと同様に、チェック例外とチェックなし例外をスローすることができます。デフォルトでは、チェックなしの実行時例外またはエラーは、コンテナーで再度発生します。チェック例外は、Web コンテナーで実行されているリソース用に、ServletException にラップされます。そのため、開発者は JSP エラー・ページなどのエラー処理機能を使用して、JAX-RS アプリケーションからスローされた例外を処理することができます。

JAX-RS には、例外 javax.ws.rs.WebApplicationException が導入されました。 開発者は、WebApplicationException の作成時に、特定のエラー・クラス名か、または javax.ws.rs.core.Response オブジェクトを指定することができます。WebApplicationException がスローされると、状況クラス名または応答オブジェクトとして例外に組み込まれた情報が、応答のシリアライズに使用されます。

例外 WebApplicationException をコードでスローできず、なおかつ Web コンテナー内のエラー処理機能を使用できない場合で、それでもカスタムのエラー応答を使用したい場合は、カスタマイズした JAX-RS javax.ws.rs.ext.ExceptionMapper クラスを作成して HTTP エラー応答に例外をマップすることができます。

以下の手順は、カスタムの ExceptionMapper クラスを作成する方法を示しています。

手順

  1. javax.ws.rs.ext.ExceptionMapper クラスを実装するクラスを作成し、そのクラスに javax.ws.rs.ext.Provider アノテーションを付けます。 このステップは、ご使用の JAX-RS リソースがそのメソッドで例外 MyCustomException をスローできることを前提としています。以下に、単純な ExceptionMapper クラスの例を示します。
    import javax.ws.rs.core.Response;
    import javax.ws.rs.ext.ExceptionMapper;
    import javax.ws.rs.ext.Provider;
    
    @Provider
    public class CustomExceptionMapper implements ExceptionMapper<MyCustomException> {
    
        public Response toResponse(MyCustomException exception) {
            return null;
        }
    
    }
  2. toResponse(MyCustomException) メソッドで、カスタマイズされたエラー応答を含む Response オブジェクトを返します。 以下に、カスタマイズされた ExceptionMapper.toResponse(MyCustomException) メソッドの例を示します。
    @Provider
    public class CustomExceptionMapper implements ExceptionMapper<MyCustomException> {
    
        public Response toResponse(MyCustomException exception) {
            return Response.status(500).entity("Unfortunately, the application cannot
                process your request at this time.").type("text/plain").build();
        }
    
    }
    エラーを記録するコードや、スローされた例外を検査するコード、あるいはより複雑なロジックを使用するコードを追加することができます。
  3. コンパイルしたカスタムの ExceptionMapper クラスを、ご使用の Web アプリケーション・プロジェクトとともにパッケージ化することができます。 Web アプリケーションに含まれるすべての JAX-RS クラスの検索をアノテーション・スキャン機能に依存している場合、追加のステップは必要ありません。しかし、JAX-RS アプリケーション・サブクラス・メソッドに含まれる、関連するすべての JAX-RS リソース・クラスおよびプロバイダーを返す場合は、返されるセットにカスタムの ExceptionMapper クラスも追加する必要があります。以下に、既存の javax.ws.rs.core.Application サブクラスの例を示します。
    import java.util.HashSet;
    import java.util.Set;
    
    import javax.ws.rs.core.Application;
    
    public class MyApplication extends Application {
    
        @Override
        public Set<Class<?>> getClasses() {
            Set<Class<?>> classes = new HashSet<Class<?>>();
            classes.add(CustomExceptionMapper.class);
            /* add your additional JAX-RS classes here */
            return classes;
        }
    }

    JAX-RS リソース・メソッドで例外が発生する場合には、HTTP エラー応答をカスタマイズして、スタック・トレースや機密の可能性があるデータがユーザーに表示されないようにすることができます。アプリケーションが正常に動作しない場合は、ExceptionMapper または Web コンテナーの例外処理機能を使用して、さらに役立つ応答を返すことができます。

タスクの結果

JAX-RS Web アプリケーションで発生する例外を処理するための、カスタムの ExceptionMapper を作成しました。


トピックのタイプを示すアイコン タスク・トピック



タイム・スタンプ・アイコン 最終更新: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_jaxrs_defresource_exception_mapper
ファイル名:twbs_jaxrs_defresource_exception_mapper.html