Menu Close

40.6. リモートサービスから返される例外のキャッチ

概要

非同期要求を行うコンシューマーは、同期リクエストを行う際に返される例外と同じものを受信しません。コンシューマーに非同期的に返される例外は ExecutionException 例外にラップされます。サービスによってスローされる実際の例外は、ExecutionException 例外の cause フィールドに保存されます。

例外のキャッチ

リモートサービスによって生成される例外は、コンシューマーのビジネスロジックに応答を渡すメソッドによりローカルでスローされます。コンシューマーが同期リクエストを行うと、リモート呼び出しを行うメソッドは例外をスローします。コンシューマーが非同期リクエストを行う場合、Response<T> オブジェクトの get() メソッドが例外をスローします。コンシューマーは、応答メッセージの取得を試みるまで、リクエストの処理でエラーが発生したことを検出しません。

JAX-WS フレームワークによって生成されるメソッドとは異なり、Response<T> オブジェクトの get() メソッドは、ユーザーがモデル化した例外や汎用 JAX-WS 例外をスローしません。代わりに java.util.concurrent.ExecutionException 例外をスローします。

例外詳細の取得

フレームワークは、リモートサービスから返された例外を ExecutionException 例外の cause フィールドに保存します。リモート例外の詳細は、cause フィールドの値を取得し、保存した例外を調べて抽出されます。格納された例外は、ユーザー定義の例外または汎用 JAX-WS 例外のいずれかになります。

例40.11「ポーリングアプローチを使用した例外のキャッチ」に、ポーリングアプローチを使用した例外のキャッチの例を示します。

例40.11 ポーリングアプローチを使用した例外のキャッチ

package demo.hw.client;

import java.io.File;
import java.util.concurrent.Future;

import javax.xml.namespace.QName;
import javax.xml.ws.Response;

import org.apache.hello_world_async_soap_http.*;

public final class Client
{
  private static final QName SERVICE_NAME
    = new QName("http://apache.org/hello_world_async_soap_http",
                "SOAPService");

  private Client() {}

  public static void main(String args[]) throws Exception
  {
    ...
    // port is a previously established proxy object.
    Response<GreetMeSometimeResponse> resp =
       port.greetMeSometimeAsync(System.getProperty("user.name"));

    while (!resp.isDone())
    {
      // client does some work
    }

    try
    {
      GreetMeSometimeResponse reply = greetMeSomeTimeResp.get();
      // process the response
    }
    catch (ExecutionException ee)
    {
       Throwable cause = ee.getCause();
       System.out.println("Exception "+cause.getClass().getName()+" thrown by the remote service.");
    }
  }
}

例40.11「ポーリングアプローチを使用した例外のキャッチ」のコードは、以下を行います。

Response<T> オブジェクトの get() メソッドへの呼び出しを try/catch ブロックにラップする。

ExecutionException 例外をキャッチする。

例外から cause フィールドを抽出する。

コンシューマーがコールバックアプローチを使用していた場合、例外のキャッチに使用されるコードは、サービスの応答が抽出されるコールバックオブジェクトに配置されます。