Menu Close

30.2. プロトコル障害

概要

リクエストの処理中にエラーが発生すると、プロトコル例外がスローされます。すべての同期リモート呼び出しは、プロトコル例外をスローする可能性があります。根本的な原因は、コンシューマーのメッセージ処理チェーンまたはサービスプロバイダーのいずれかで発生します。

JAX-WS 仕様は、汎用プロトコル例外を定義します。また、SOAP 固有のプロトコル例外と、HTTP 固有のプロトコル例外も指定します。

プロトコル例外の種類

JAX-WS 仕様は、3 種類のプロトコル例外を定義します。キャッチする例外は、アプリケーションによって使用されるトランスポートとバインディングによって異なります。

表30.2「汎用プロトコル例外の種類」で、3 種類のプロトコル例外と、その例外がスローされるタイミングを説明します。

表30.2 汎用プロトコル例外の種類

例外クラススローされるタイミング

javax.xml.ws.ProtocolException

この例外は、汎用プロトコル例外です。使用中のプロトコルに関係なく、キャッチできます。SOAP バインディングまたは HTTP バインディングを使用している場合は、特定の障害型にキャストできます。HTTP または JMS トランスポートと組み合わせて XML バインディングを使用すると、汎用プロトコル例外をより具体的な障害型にキャストすることはできません。

javax.xml.ws.soap.SOAPFaultException

この例外は、SOAP バインディングの使用時にリモート呼び出しによってスローされます。詳細は、「SOAP プロトコル例外の使用」を参照してください。

javax.xml.ws.http.HTTPException

この例外は、Apache CXF HTTP バインディングを使用して RESTful Web サービスを開発する際にスローされます。詳細は、パートVI「RESTful Web サービスの開発」を参照してください。

SOAP プロトコル例外の使用

SOAPFaultException 例外は SOAP 障害をラップします。根本の SOAP 障害は、javax.xml.soap.SOAPFault オブジェクトとして fault フィールドに保存されます。

サービス実装がアプリケーション用に作成されたカスタム例外にマッチしない例外をスローする必要がある場合は、例外クリエーターを使用して SOAPFaultException に障害をラッピングし、コンシューマーにスローバックすることができます。例30.1「SOAP プロトコル例外のスロー」に、メソッドに無効なパラメーターが渡された場合に SOAPFaultException を作成およびスローするコードを示します。

例30.1 SOAP プロトコル例外のスロー

public Quote getQuote(String ticker)
{
  ...
  if(tickers.length()<3)
  {
    SOAPFault fault = SOAPFactory.newInstance().createFault();
    fault.setFaultString("Ticker too short");
    throw new SOAPFaultException(fault);
  }
  ...
}

コンシューマーが SOAPFaultException 例外をキャッチした場合、ラップされた SOAPFault 例外を調べて、例外の根本的な原因を取得できます。例30.2「SOAP プロトコル例外からの障害の取得」にあるように、SOAPFault 例外は SOAPFaultException 例外の getFault() メソッドを使用して取得されます。

例30.2 SOAP プロトコル例外からの障害の取得

...
try
{
  proxy.getQuote(ticker);
}
catch (SOAPFaultException sfe)
{
  SOAPFault fault = sfe.getFault();
  ...
}