JAX-RS アプリケーション用のユーザー・ハンドラーの実装

ハンドラー・チェーン動作をカスタマイズし、固有機能をハンドラーに追加するために、ユーザー・ハンドラーを開発することができます。Java™ API for RESTful Web Services (JAX-RS) アプリケーションのサーバー・サイドでユーザー・ハンドラーを実装すると、要求と応答の処理を強化できます。

このタスクについて

カスタム・サーバー・サイドのユーザー・ハンドラーは、要求ハンドラー・チェーン、応答ハンドラー・チェーン、およびエラー・ハンドラー・チェーンに追加できます。すべてのクライアント要求のロギングなどの追加処理が必要な場合は、ロギング機能を実装する 1 つの方法としてユーザー・ハンドラーを追加できます。

ハンドラーは一般的に、MessageContext インスタンスを受け取って現行の要求情報にアクセスして操作し、HandlerChain インスタンスを受け取ってチェーンを進みます。ハンドラー・チェーン内で制御を 1 つのハンドラーから別のハンドラーに渡すために、ハンドラーは HandlerChain インスタンスの doChain() メソッドを呼び出す役割を果たします。ハンドラーは doChain() メソッドを複数回呼び出せるため、同じ要求に対してハンドラーが 2 回以上呼び出される可能性があることを考慮する必要があります。 ハンドラーに関連するすべてのインターフェースは org.apache.wink.server.handlers パッケージにあります。

ハンドラーは MessageContext インターフェースを使用して、現行の要求情報にアクセスし、操作します。このインターフェースを使用すると、ハンドラーはメッセージ・コンテキストの属性を設定することでメッセージの状態を維持できます。またこのインターフェースを使用すると、情報をチェーン上の他のハンドラーに渡すこともできます。

要求ハンドラー・チェーンには要求を JAX-RS 仕様に従って処理する役割があり、要求の受け入れ、呼び出すリソース・メソッドの検索、要求エンティティーのデシリアライズ、および最終的なリソース・メソッドの呼び出しを実行します。要求ハンドラーは、org.apache.wink.server.handlers.RequestHandler インターフェースを実装するクラスです。

応答ハンドラー・チェーンの役割は、リソース・メソッドまたはサブリソース・メソッドの呼び出しによって戻されたオブジェクトを JAX-RS 仕様に従って処理することです。応答状況コードの判断、応答メディア・タイプの選択、および応答エンティティーのシリアライズを実行します。応答ハンドラーは、org.apache.wink.server.handlers.ResponseHandler インターフェースを実装するクラスです。

ユーザー・ハンドラー・クラスは、org.apache.wink.server.handlers.RequestHandler インターフェースまたは org.apache.wink.server.handlers.ResponseHandler インターフェースを実装する必要があります。要求ハンドラーまたは応答ハンドラーが戻されるように org.apache.wink.server.handlers.HandlersFactory インターフェースを拡張するクラスを作成する必要があります。最後に、HandlersFactory クラス名を含むプロパティー・ファイルの場所を web.xml ファイルの初期化パラメーターとして指定することで、そのプロパティー・ファイルがサーブレットまたはフィルターによって確実に読み取られるようにする必要があります。

手順

  1. 要求ハンドラーのハンドラー・インターフェースを実装する Java クラスを作成します。 次の例では、要求ハンドラーが作成されます。この特定の要求ハンドラーは、RESTful サービスに対するすべての要求のパスを表示します。
    package com.example;
    
    public class MyRequestHandler implements org.apache.wink.server.handlers.RequestHandler {
        public void init(java.util.Properties props) {
                      /* This class is initialized with runtime properties. */
        }
    
            public void handleRequest(MessageContext context, HandlersChain chain) {
            UriInfo info = context.getUriInfo();
                    System.out.println(“The path relative to the base URI is : “ + info.getPath());
            chain.doChain(context);
        }
    }

    ハンドラー・チェーンを継続するには、chain.doChain(context) メソッドを呼び出します。org.apache.wink.server.handlers.AbstractHandler インターフェースを使用してハンドラー・チェーンを拡張します。コンテキストで使用可能なすべてのメソッドについて詳しくは、Javadoc に関する資料を参照してください。

  2. ハンドラー・ファクトリーの実装を作成します。 ハンドラー・ファクトリーには、引数なしの public コンストラクターが必要です。
    public class MyHandlersFactory extends org.apache.wink.server.handlers.HandlersFactory {
            public MyHandlersFactory() {
                    /* This constructor must exist because it is the only one called.*/
        }
    }
  3. ハンドラー・ファクトリー・クラスで、ユーザー・ハンドラーを戻して適切なハンドラー・チェーンに追加するように、適切なメソッドをオーバーライドします。 この例では要求ハンドラーが作成済みであるため、getRequestHandlers() メソッドがオーバーライドされています。
    package com.example;
    
    public class MyHandlersFactory extends org.apache.wink.server.handlers.HandlersFactory {
            public MyHandlersFactory() {
                    /* This constructor must exist because it is the only one called.*/
        }
    
            public List<? extends org.apache.wink.server.handlers.RequestHandler> getRequestHandlers() {
            return Arrays.asList(com.example.MyRequestHandler);
        }
    }
  4. ランタイムに初期化されるように、プロパティーを含むシンプルなテキスト・ファイルを作成します。 次の例では、プロパティー・ファイルに、カスタム・ハンドラー・ファクトリーを指定する以下のステートメントが含まれています。
    wink.handlersFactoryClass=com.example.MyHandlersFactory
  5. web.xml ファイルで、propertiesLocation 初期化パラメーターを、プロパティー・ファイルを指定するサーブレット定義またはフィルター定義に追加します。 web.xml ファイルの初期化パラメーターとして HandlersFactory クラス名を含むプロパティー・ファイルの場所を指定すると、プロパティー・ファイルが JAX-RS サーブレットまたは JAX-RS フィルターによって確実に読み取られます。
    <servlet>
        <servlet-name>RestServlet</servlet-name>
        <servlet-class>com.ibm.websphere.jaxrs.server.IBMRestServlet</servlet-class>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>com.example.MyJAXRSApplicationSubclass</param-value>
        </init-param>
        <init-param>
            <param-name>propertiesLocation</param-name>
            <param-value>myproperties.properties</param-value>
        </init-param>
      </servlet>

タスクの結果

ユーザー・ハンドラーが、JAX-RS アプリケーションのサーバー・サイドにあるハンドラー・チェーンに追加されたため、これらのカスタム・ハンドラーがすべての要求プロセスまたは応答プロセスで呼び出されるようになりました。


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



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