36.5.1 handleMessageメソッドの処理
handleMessageメソッドについて,trueを返す場合,falseを返す場合,および例外をスローする場合の処理について説明します。
- 〈この項の構成〉
(1) trueを返す場合
handleMessageメソッドがtrueを返す場合,JAX-WSエンジンは現在実行中の方向のままハンドラを処理します。それ以上ハンドラがなければ,メッセージを振り分けます。
要求処理の流れを次の図に示します。
応答処理の流れを次の図に示します。
(2) falseを返す場合
要求メッセージを処理しているhandleMessageメソッドがfalseを返す場合,JAX-WSエンジンはメッセージとハンドラ処理の方向を逆転させて,前のハンドラのhandleMessageメソッドを呼び出します。それ以上ハンドラがなければ,メッセージを振り分けます。
要求処理でハンドラ2がfalseを返す場合の流れを次の図に示します。
JAX-WSエンジンは,メッセージコンテキストに設定されたメッセージを変更しません。したがって,要求メッセージはそのままWebサービスクライアントに振り分けられます。意図した応答メッセージが振り分けられなかったWebサービスクライアントでは,javax.xml.ws.WebServiceExceptionがスローされます。
応答メッセージを処理しているhandleMessageメソッドがfalseを返す場合,メッセージの方向は変えません。ただし,以降のハンドラをすべて省略して,メッセージを振り分けます。
応答処理でハンドラ2がfalseを返す場合の流れを次の図に示します。
(3) ProtocolExceptionまたはそのサブクラスをスローする場合
要求メッセージを処理しているhandleMessageメソッドがProtocolExceptionまたはそのサブクラスをスローする場合,JAX-WSエンジンはメッセージとハンドラ処理の方向を逆転させて,前のハンドラのhandleFaultメソッドを呼び出します。それ以上ハンドラがなければ,メッセージを振り分けます。
要求処理でハンドラ2がProtocolExceptionをスローする場合の流れを次の図に示します。
JAX-WSエンジンは,フォルトメッセージを生成して伝搬させます。生成するメッセージは,SOAPのバージョンによって次の表のとおりに異なります。
バージョン |
フォルトメッセージ |
|
---|---|---|
SOAP 1.1仕様 |
Webサービスクライアント側 |
faultcodeはQName soapenv:Client |
Webサービス側 |
faultcodeはQName soapenv:Server |
|
SOAP 1.2仕様 |
Webサービスクライアント側 |
soapenv12:CodeはQName soapenv12:Sender |
Webサービス側 |
soapenv12:CodeはQName soapenv12:Receiver |
応答メッセージを処理しているhandleMessageメソッドがProtocolExceptionまたはそのサブクラスをスローする場合,メッセージの方向は変えません。ただし,以降のハンドラをすべて省略して,例外をそのままスローします。
応答処理でハンドラ2がProtocolExceptionをスローする場合の流れを次の図に示します。
Webサービス側の場合,JAX-WSエンジンは例外をSOAPフォルトに変換して送信します。フォルトメッセージの変換については,「10.4.1(2) ランタイム例外のバインディング」を参照してください。
(4) ほかのランタイム例外をスローする場合
要求メッセージを処理しているhandleMessageメソッドがほかのランタイム例外をスローする場合,JAX-WSエンジンはメッセージとハンドラ処理の方向を逆転させます。また,以降のハンドラをすべて省略し,例外をそのままスローします。
要求処理でハンドラ2がRuntimeExceptionをスローする場合の流れを次の図に示します。
Webサービス側の場合,JAX-WSエンジンは例外をSOAPフォルトに変換して送信します。フォルトメッセージの変換については,「10.4.1(2) ランタイム例外のバインディング」を参照してください。
Webサービスクライアント側の場合,JAX-WSエンジンは例外をjavax.xml.ws.WebServiceExceptionでラップして,WebServiceExceptionをスローします。
応答メッセージを処理しているhandleMessageメソッドがランタイム例外をスローする場合,メッセージの方向は変えません。ただし,以降のハンドラをすべて省略して,メッセージを振り分けます。
応答処理でハンドラ2がRuntimeExceptionをスローする場合の流れを次の図に示します。
Webサービス側の場合,JAX-WSエンジンは例外をSOAPフォルトに変換して送信します。フォルトメッセージの変換については,「10.4.1(2) ランタイム例外のバインディング」を参照してください。
Webサービスクライアント側の場合,JAX-WSエンジンは例外をjavax.xml.ws.WebServiceExceptionでラップして,WebServiceExceptionをスローします。