30.2. プロトコル障害
概要
リクエストの処理中にエラーが発生すると、プロトコル例外が出力されます。すべての同期リモート呼び出しは、プロトコル例外を出力する可能性があります。根本的な原因は、コンシューマーのメッセージ処理チェーンまたはサービスプロバイダーのいずれかで発生します。
JAX-WS 仕様は、一般的なプロトコル例外を定義しています。また、SOAP 固有のプロトコル例外と HTTP 固有のプロトコル例外も指定します。
プロトコル例外の種類
JAX-WS 仕様では、3 種類のプロトコル例外が定義されています。どの例外をキャッチするかは、アプリケーションで使用されるトランスポートとバインディングによって異なります。
表30.2「一般的なプロトコルの例外の種類」 3 種類のプロトコル例外とそれらがいつ出力されるかを説明します。
例外クラス | 投げられたとき |
---|---|
javax.xml.ws.ProtocolException | この例外は、一般的なプロトコル例外です。使用中のプロトコルに関係なくキャッチできます。SOAP バインディングまたは HTTP バインディングを使用している場合は、特定の障害タイプにキャストできます。XML バインディングを HTTP または JMS トランスポートと組み合わせて使用する場合、汎用プロトコル例外をより具体的な障害タイプにキャストすることはできません。 |
javax.xml.ws.soap.SOAPFaultException | この例外は、SOAP バインディングを使用するときにリモート呼び出しによって出力されます。詳細は、「SOAP プロトコル例外の使用」 を参照してください。 |
javax.xml.ws.http.HTTPException | この例外は、Apache CXF バインディングを使用して 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();
...
}