10.2.2 ディスカバリとディスパッチ
JAX-WSエンジン上では,SOAPメッセージの送受信を実現するために,Webサービス実装クラスのディスカバリ,およびSOAPメッセージのディスパッチが行われます。
ここでは,Webサービス実装クラスのディスカバリ,SOAPメッセージのディスパッチ,およびフォルトと例外クラスのマッピングについて説明します。
また,インタフェースの透過性についても説明します。
- 〈この項の構成〉
(1) ディスカバリ
Webサービス側のJAX-WSエンジンによって,Webサービスクライアントから要求されたWebサービス実装クラスまたはプロバイダ実装クラスが見つけ出されます。このことをディスカバリといいます。
ディスカバリでは,SOAP要求メッセージで要求されたURLから,適切なWebサービス実装クラスをマッピングする処理が行われます。ここでは,次のURLが要求された場合のマッピングについて説明します。
http://example.org/fromwsdl/TestJaxWsService
コンテキストルートを"fromwsdl"とした場合,コンテキストルートの後ろの"/TestJaxWsService"(下線部)はパス情報を表します。このパス情報を基に,Webサービス実装クラスまたはプロバイダ実装クラスがマッピングされます。
パス情報とのマッピングについて,Webサービス実装クラスの場合の例を次に示します。
Webサービス側のJAX-WSエンジンは,デプロイされているWebサービス実装クラスまたはプロバイダ実装クラスのうち,パス情報に対応するクラスを呼び出します。
POJOのWebサービスの場合,javax.jws.WebServiceアノテーションまたはjavax.xml.ws.WebServiceProviderアノテーションのserviceName属性が,パス情報から先頭のスラッシュ(/)を取り除いた文字列に等しいものを呼び出します。
EJBのWebサービスの場合,javax.jws.WebServiceアノテーションのserviceName属性が,パス情報の先頭のスラッシュ(/)と2番目のスラッシュ(/)の間の文字列に等しく,javax.jws.WebServiceアノテーションのname属性の値が,パス情報の2番目のスラッシュ(/)より後ろの文字列に等しいものを呼び出します。
javax.jws.WebServiceアノテーションおよびjavax.xml.ws.WebServiceProviderアノテーションのserviceName属性は省略できます。省略されている場合は,JSR-181仕様に基づいて,Webサービス実装クラスまたはプロバイダ実装クラスのクラス名(単純名)にサフィックスとして"Service"を付加された文字列が,serviceName属性の値と見なされます。また,javax.jws.WebServiceアノテーションのname属性は省略できます。省略されている場合は,JSR-181仕様に基づいて,Webサービス実装クラスのクラス名(単純名)がname属性の値と見なされます。
POJOのWebサービスの例でのパス情報と,呼び出されるWebサービス実装クラスの対応を示します。
-
パス情報がSample1Serviceの場合
Webサービス実装クラスA(org.foo.Test1.java)が呼び出されます。
-
パス情報がSample2Serviceの場合
Webサービス実装クラスB(org.foo.Test2.java)が呼び出されます。
-
パス情報がTest3Serviceの場合
Webサービス実装クラスC(org.foo.Test3.java)が呼び出されます。
EJBのWebサービスの例でのパス情報と,呼び出されるWebサービス実装クラスの対応を示します。
-
パス情報が/Sample1Service/Sample1の場合
EJB 1(org.foo.Test1.java)が呼び出されます。
-
パス情報が/Sample2Service/Test2の場合
EJB 2(org.foo.Test2.java)が呼び出されます。
-
パス情報が/Test3Service/Test3の場合
EJB 3(org.foo.Test3.java)が呼び出されます。
このマッピングは,cosminexus-jaxws.xmlを記述することでカスタマイズできます。次に示すcosminexus-jaxws.xmlの記述例を基に,マッピングのカスタマイズについて説明します。
<?xml version="1.0" encoding="UTF-8"?> <endpoints xmlns='http://java.sun.com/xml/ns/jax-ws/ri/runtime'> <endpoint name="test1" implementation="org.foo.Test1" url-pattern="/test1" /> <endpoint name="test2" implementation="org.foo.Test2" url-pattern="/test2" /> <endpoint name="test3" implementation="org.foo.Test3" url-pattern="/test3" /> </endpoints>
この例でのパス情報と,呼び出されるWebサービス実装クラスの対応を示します。
-
パス情報がtest1の場合
Webサービス実装クラスA(org.foo.Test1.java)が呼び出されます。
-
パス情報がtest2の場合
Webサービス実装クラスB(org.foo.Test2.java)が呼び出されます。
-
パス情報がtest3の場合
Webサービス実装クラスC(org.foo.Test3.java)が呼び出されます。
ただし,cosminexus-jaxws.xmlのurl-pattern属性と,web.xmlのurl-pattern要素は,1対1で対応している必要があります。したがって,この例のマッピングをカスタマイズした場合は,web.xmlでも記述を変更する必要があります。web.xmlの記述例を示します。
<?xml version="1.0" encoding="UTF-8"?> <web-app ...> ... <servlet-mapping> <servlet-name>CosminexusJaxwsServlet</servlet-name> <url-pattern>/test1</url-pattern> <url-pattern>/test2</url-pattern> <url-pattern>/test3</url-pattern> </servlet-mapping> ... </web-app>
cosminexus-jaxws.xmlのカスタマイズ方法については,「10.3 cosminexus-jaxws.xmlによるカスタマイズ」を参照してください。
(2) SOAPメッセージのディスパッチ
Webサービス側のJAX-WSエンジンでは,発見した対象がWebサービス実装クラスの場合,受信したSOAPメッセージの内容に応じてオペレーションに対応するメソッドが呼び出され,実行されます。発見した対象がプロバイダ実装クラスの場合,アンマーシャルしたSOAPメッセージはプロバイダ実装クラスが指定するオブジェクトに変換され,invoke()メソッドが呼び出さます。
SOAPメッセージは,WS-I Basic Profile 1.1およびAttachments Profile 1.0を適用した,次のどれかの仕様に準拠していなければなりません。
-
SOAP 1.1仕様
-
SOAP 1.2仕様
-
SwA仕様(wsi:swaRef形式の添付ファイルを利用する場合)
-
MTOM/XOP仕様(MTOM/XOP仕様形式の添付ファイルを利用する場合)
SOAP 1.1仕様の場合のSOAPメッセージの例を次に示します。なお,添付ファイルを付けないSOAPメッセージの例を示します。添付ファイル付きSOAPメッセージについては,「28.4 添付ファイル付きSOAPメッセージ(wsi:swaRef形式)」を参照してください。
POST http://sample.org/fromjava/AddNumbersImplService HTTP/1.1 SOAPAction: "" Content-Type: text/xml;charset="utf-8" Accept: text/xml, multipart/related, text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 <?xml version="1.0" ?> <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> <S:Body> <ns2:add xmlns:ns2="http://sample.com/"> <arg0>256</arg0> <arg1>103</arg1> </ns2:add> </S:Body> </S:Envelope>
メッセージ先頭にHTTPリクエストライン(POSTの行)およびHTTPリクエストのヘッダフィールド(SOAPAction,Content-Type,およびAcceptの行)が続きます。そのあとに空白行が入り,SOAPメッセージが続きます。このSOAPメッセージの内容を基に,適切なSEIが呼び出されて処理されます。
HTTPリクエストのヘッダフィールドには,空文字("")が設定されたSOAPActionヘッダが必要です。SOAPActionヘッダに値が設定されていたとしても,JAX-WSエンジンによって無視されます。SOAPActionヘッダの値が引用符「"」で囲まれていない場合,エラーメッセージが出力されます(KDJW3022-W)。また,SOAPActionヘッダがHTTPリクエストに含まれていない場合の動作については,動作定義ファイルの設定によって異なります。動作定義ファイル設定については,「10.1 動作定義ファイル」を参照してください。
SOAP 1.2仕様の場合のSOAPメッセージの例を次に示します。なお,添付ファイルを付けないSOAPメッセージの例を示します。添付ファイル付きSOAPメッセージについては,「28.4 添付ファイル付きSOAPメッセージ(wsi:swaRef形式)」を参照してください。
POST http://sample.org/fromjava/AddNumbersImplService HTTP/1.1 Content-Type: application/soap+xml;charset="utf-8";action="" Accept: application/soap+xml, multipart/related, text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 <?xml version="1.0" ?> <S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope"> <S:Body> <ns2:add xmlns:ns2="http://sample.com/"> <arg0>256</arg0> <arg1>103</arg1> </ns2:add> </S:Body> </S:Envelope>
SOAP 1.2仕様の場合,SOAPActionヘッダは,HTTPリクエストのヘッダフィールドに出現しても無視されます。また,actionパラメタは省略できます。