Java API for XML-based Remote Procedure Call (JAX-RPC) アプリケーションのデータは、Extensible Markup Language (XML) としてフローします。JAX-RPC アプリケーションはマッピングを使用して、Java 言語と Extensible Markup Language (XML) テクノロジー (WebSphere Application Server でサポートされる XML スキーマ、Web サービス記述言語 (WSDL)、および SOAP を含む) との間のデータ変換を記述します。
JAX-RPC アプリケーションでは、Java 言語と XML 間のマッピングの大部分は、JAX-RPC 仕様で指定されています。一部、オプションのマッピングや JAX-RPC で指定されていないマッピングもサポートしています。 API の完全なリストについては、 JAX-RPC 仕様を参照してください。 また、Web サービス: 学習用リソースにある Web サービスの開発についての項目も検討します。
以下の表は、ここで使用されるネーム・スペースの接頭部と、 それに対応するネーム・スペースです。
ネーム・スペースの接頭部 | ネーム・スペース |
xsd | http://www.w3.org/2001/XMLSchema |
xsi | http://www.w3.org/2001/XMLSchema-instance |
soapenc | http://schemas.xmlsoap.org/soap/encoding/ |
wsdl | http://schemas.xmlsoap.org/wsdl/ |
wsdlsoap | http://schemas.xmlsoap.org/wsdl/soap/ |
ns | ユーザー定義のネーム・スペース |
apache | http://xml.apache.org/xml-soap |
wasws | http://websphere.ibm.com/webservices/ |
JAX-RPC 仕様では、 Java パッケージ名の XML ネーム・スペースへのデフォルト・マッピングが指示されていません。 JAX-RPC 仕様では、各 Java パッケージを 単一の XML ネーム・スペースにマップする必要があることが指定されています。さらに、各 XML ネーム・スペースは単一の Java パッケージにマップする必要があります。Java パッケージの名前を反転し http:// という接頭部を 追加することでネーム・スペースを作成するという、デフォルトのマッピング・アルゴリズムが用意されています。 例えば、com.ibm.webservice という名前のパッケージは、 XML ネーム・スペース http://webservice.ibm.com にマップされます。
XML ネーム・スペースと Java パッケージ名との間のデフォルト・マッピングは、 WSDL2Java コマンドおよび Java2WSDL コマンドの -NStoPkg オプションおよび -PkgtoNS オプションを使用してオーバーライドできます。
Java ID は、WSDL ID および XML ID に直接マップされます。
Java Bean のプロパティー名は、XML ID にマップされます。 例えば、getInfo メソッドおよび setInfo メソッドを持つ Java Bean は、info という名前の XML 構成体にマップされます。
サービス・エンドポイント・インターフェース・メソッドのパラメーター名が使用可能な場合、 それらは直接 WSDL ID および XML ID にマップされます。 詳しくは、『WSDL2Java コマンド』の -implClass オプションを参照してください。
以下の表に、 Java 構成体から関連する WSDL 構成体および XML 構成体へのマッピングをまとめます。
Java 構成体 | WSDL および XML 構成体 |
サービス・エンドポイント・インターフェース | wsdl:portType |
メソッド | wsdl:operation |
パラメーター | wsdl:input、wsdl:message、wsdl:part |
リターン | wsdl:output、wsdl:message、wsdl:part |
スロー | wsdl:fault、wsdl:message、wsdl:part |
プリミティブ型 | xsd および soapenc の単純な型 |
Java Bean | xsd:complexType |
Java Bean プロパティー | xsd:complexType のネストされた xsd:element |
配列 | JAX-RPC 定義の xsd:complexType または xsd:element (属性 maxOccurs="unbounded" を指定) |
ユーザー定義の例外 | xsd:complexType |
生成される wsdl:portType に準拠した wsdl:binding が生成されます。 生成される wsdl:binding を参照するポートを含む wsdl:service が生成されます。バインディングおよびサービスの名前は、 Java2WSDL コマンドによって制御されます。
Java2WSDL コマンドは、Web Services - Interoperability (WS-I) 仕様に準拠したドキュメント/リテラル WSDL ファイルを生成します。生成される wsdl:binding の組み込み属性は、 style="document" および use="literal" となります。 xsd:element は、サービス・エンドポイント・インターフェースの各メソッドが要求メッセージを記述するために生成されます。 サービス・エンドポイント・インターフェースの各メソッドが応答メッセージを記述する場合にも、 同じ xsd:element が生成されます。
Java2WSDL コマンドは、 WS-I 準拠の rpc-literal WSDL ファイルを生成します。生成される wsdl:binding の組み込み属性は、 style="rpc" および use="literal" となります。 wsdl:message 構成体は、サービス・エンドポイント・インターフェースの各メソッドの入出力用に生成されます。 メソッドのパラメーターは、 wsdl:message 構成体内のパート・エレメントによって記述されます。
Java2WSDL コマンドは、 JAX-RPC 仕様に従って document-literal WSDL ファイルを生成します。この WSDL ファイルは、 .NET には準拠していません。DOCUMENT LITERAL と DOCUMENT LITERAL (ラップなし) の主な違いは、 要求および応答メッセージの定義に wsdl:message 構成体を使用するかどうかです。
Java2WSDL コマンドは、 JAX-RPC 仕様に従って rpc-encoded WSDL ファイルを生成します。この WSDL ファイルは、 WS-I 仕様には準拠していません。生成される wsdl:binding の組み込み属性は、 style="rpc" および use="encoded" となります。 型および配列を表すには、特定の soapenc マッピングが使用されます。
Java 型から標準 XML 型へのマッピング
Java 型の多くは、 標準 XML 型に直接マップされます。 例えば、java.lang.String は xsd:string にマップされます。これらのマッピングについては JAX-RPC 仕様に記述されています。
wsdl:types の生成
Java: public abstract class Base { public Base() {} public int a; // mapped private int b; // mapped via setter/getter private int c; // not mapped private int[] d; // mapped via indexed setter/getter public int getB() { return b;} // map property b public void setB(int b) {this.b = b;} public int[] getD() { return d;} // map indexed property d public void setD(int[] d) {this.d = d;} public int getD(int index) { return d[index];} public void setB(int index, int value) {this.d[index] = value;} public void someMethod() {...} // not mapped } public class Derived extends Base { public int x; // mapped private int y; // not mapped } マップ先: <xsd:complexType name="Base" abstract="true"> <xsd:sequence> <xsd:element name="a" type="xsd:int" /> <xsd:element name="b" type="xsd:int" /> <xsd:element name="d" minOccurs="0" maxOccurs="unbounded" type="xsd:int"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="Derived"> <xsd:complexContent> <xsd:extension base="ns:Base"> <xsd:sequence> <xsd:element name="x" type="xsd:int" /> </xsd:sequence> </xsd:extension> </xsd:complexContent> </xsd:complexType>
クラスを XML 型にマッピングできない場合、 Java2WSDL コマンドはメッセージを発行し、WSDL ファイルには xsd:anyType 参照が生成されます。 このような場合には、JAX-RPC に準拠したクラスを使用するように Web サービスのインプリメンテーションを変更します。
WSDL2Java コマンドは、 WSDL ファイル内の情報を使用する Java クラスを生成します。
JAX-RPC では、 XML ネーム・スペースから Java パッケージ名へのマッピングを指定していません。 JAX-RPC では、各 Java パッケージを単一の XML ネーム・スペースにマップするように指定されています。さらに、各 XML ネーム・スペースは単一の Java パッケージにマップする必要があります。デフォルトのマッピング・アルゴリズムでは、 XML ネーム・スペースからプロトコルを省略し、名前を反転させます。 例えば、XML ネーム・スペース http://websphere.ibm.com は、 com.ibm.websphere という名前の Java パッケージになります。
XML ネーム・スペースから Java パッケージへのデフォルトのマッピングでは、 コンテキスト・ルートは無視されます。 1 つ目のスラッシュまで 2 つのネーム・スペースが同じ場合、 それらは同じ Java パッケージにマップされます。 例えば、XML ネーム・スペース http://websphere.ibm.com/foo および http://websphere.ibm.com/bar は、 Java パッケージ com.ibm.websphere にマップされます。XML ネーム・スペースと Java パッケージ名との間のデフォルト・マッピングは、 WSDL2Java コマンドおよび Java2WSDL コマンドの -NStoPkg オプションおよび -PkgtoNS オプションを使用してオーバーライドできます。
ID のマッピング
XML 名の情報は Java ID よりも豊富です。XML 名には Java ID では認められていない文字を含めることができます。 XML 名から Java ID へのマッピング規則については、 JAX-RPC 仕様の付録 20 を参照してください。
WSDL および XML 構造 | Java 構造 |
xsd:complexType | Java Bean クラス、Java 例外クラス、 または Java 配列 |
ネストされた xsd:element/xsd:attribute | Java Bean プロパティー |
xsd:simpleType (列挙型) | JAX-RPC 列挙型クラス |
wsdl:message メソッド・パラメーター・シグニチャーは、 通常、wsdl:message によって決まります。 | サービス・エンドポイント・インターフェース・メソッド・シグニチャー |
wsdl:portType | サービス・エンドポイント・インターフェース |
wsdl:operation | サービス・エンドポイント・インターフェース・メソッド |
wsdl:binding | スタブ |
wsdl:service | サービス・インターフェース |
wsdl:port | サービス・インターフェース内のポート accessor メソッド |
XML 型の多くは、 Java 型に直接マップされます。これらのマッピングの詳細については、JAX-RPC 仕様を参照してください。
wsdl:types セクションで定義される XML 型のマッピング
WSDL2Java コマンドは、 wsdl:types セクションで定義されている XML スキーマ構成体に対する Java 型を生成します。 XML スキーマ言語は、JAX-RPC 仕様で定義されている必須またはオプションのサブセットに比べ、 機能が豊富です。WSDL2Java コマンドは、必須マッピング、 ほとんどのオプション・マッピングに加えて、JAX-RPC 仕様に含まれていない一部の XML スキーマ・マッピングまでサポートしています。 WSDL2Java コマンドは、サポートしていないいくつかの構成体を無視します。 例えば、このコマンドではデフォルト属性はサポートされていません。 xsd:element がデフォルト属性で定義されている場合、 そのデフォルト属性は無視されます。場合によっては、 このコマンドで、サポートされない構成体が Java インターフェース javax.xml.soap.SOAPElement にマップされることがあります。
XML: <xsd:complexType name="Sample"> <xsd:sequence> <xsd:element name="a" type="xsd:string"/> <xsd:element name="b" maxOccurs="unbounded" type="xsd:string"/> </xsd:sequence> </xsd:complexType> Java: public class Sample { // .. public Sample() {} // Bean Property a public String getA() {...} public void setA(String value) {...} // Indexed Bean Property b public String[] getB() {...} public String getB(int index) {...} public void setB(String[] values) {...} public void setB(int index, String value) {...} }
wsdl:portType 構成体は、 サービス・エンドポイント・インターフェースにマップされます。wsdl:portType 構成体の名前は、 サービス・エンドポイント・インターフェースのクラス名にマップされます。
WSDL: <xsd:element name="myMethod" > <xsd:complexType> <xsd:sequence> <xsd:element name="param1" type="xsd:string" /> <xsd:element name="param2" type="xsd:int" /> </xsd:sequence> </xsd:complexType> </xsd:element> ... <wsdl:message name="response" /> <part name="parameters" element="ns:myMethod" /> </wsdl:message name="response" /> <wsdl:message name="response" /> ... <wsdl:operation name="myMethod"> <input name="input" message="request" /> <output name="output" message="response" /> </wsdl:operation> Java: void myMethod(String param1, int param2) ...
ドキュメント/リテラル・ラップ・フォーマットが検出されない場合、 パラメーターのマッピングは JAX-RPC 仕様の 4.3.4 節に記載されている標準の JAX-RPC マッピング規則に従います。
XML: <wsdl:message name="request"> <part name="param1" type="xsd:string" /> <part name="param2" type="xsd:int" /> </wsdl:message name="response" /> <wsdl:message name="response" /> ... <wsdl:operation name="myMethod" parameterOrder="param1, param2"> <input name="input" message="request" /> <output name="output" message="response" /> </wsdl:operation> Java: void myMethod(String param1, int param2) ...
XML: <wsdl:types> <schema ...> <complexType name="ArrayOfBinary"> <restriction base="soapenc:Array"> <attribute ref="soapenc:arrayType" wsdl:arrayType="xsd:binary[]" /> </restriction> </complexType> </schema> </wsdl:types> <wsdl:message name="request"> <part name="param1" type="ns:ArrayOfBinary" /> <wsdl:message name="response" /> <wsdl:message name="response" /> ... <wsdl:operation name="myMethod"> <input name="input" message="request" /> <output name="output" message="response" /> </wsdl:operation> ... <binding ... <wsdl:operation name="myMethod"> <input> <mime:multipartRelated> <mime:part> <mime:content part="param1" type="image/jpeg"/> </mime:part> </mime:multipartRelated> </input> ... </wsdl:operation> Java: void myMethod(java.awt.Image param1) ...JAX-RPC 仕様は、以下の MIME タイプのサポートを必要とします。
MIME タイプ | Java 型 |
image/gif | java.awt.Image |
image/jpeg | java.awt.Image |
text/plain | java.lang.String |
multipart/* | javax.mail.internet.MimeMultipart |
text/xml | javax.xml.transform.Source |
application/xml | javax.xml.transform.Source |
wsdl:service エレメントは、 生成されるサービス・インターフェースにマップされます。生成されるサービス・インターフェースには、 wsdl:service エレメント内の各ポートにアクセスするためのメソッドが組み込まれています。 生成されるサービス・インターフェースについては、JAX-RPC 仕様の 4.3.9 節、4.3.10 節、および 4.3.11 節に記載されています。
また、wsdl:service エレメントは、生成されるサービス・インタ ーフェースのインプリメンテーションである、 インプリメンテーション固有の ServiceLocator クラスにマップされます。
WSDL ファイルでは、 ネットワーク接続を介して送信される SOAP メッセージのフォーマットが定義されます。 WSDL2Java コマンドおよび WebSphere Application Server ランタイムは、 WSDL ファイル内の情報を使用して、SOAP メッセージが適切に直列化および非直列化されていることを確認します。
DOCUMENT と RPC、LITERAL と ENCODED の関係
wsdl:binding エレメントで、 メッセージが RPC フォーマットを使用して送信されることが示されている場合、 SOAP メッセージにはその操作を定義するエレメントが含まれます。 wsdl:binding エレメントで、メッセージが文書フォーマットを使用して送信されることが示されている場合、 SOAP メッセージには operation エレメントは含まれません。
wsdl:part エレメントが type 属性を使用して定義されている場合、 そのパートの名前と型がメッセージで使用されます。 wsdl:part エレメントが element 属性を使用して定義されている場合、 そのエレメントの名前と型がメッセージで使用されます。 use="encoded" の場合、element 属性は JAX-RPC 仕様ではサポートされません。
DOCUMENT/LITERAL WSDL: <xsd:element name="c" type="xsd:int" /> <xsd:element name="method"> <xsd:complexType> <xsd:sequence> <xsd:element name="a" type="xsd:string"/> <xsd:element ref="ns:c"/> </xsd:sequence> </xsd:complexType> </xsd:element> ... <wsdl:message name="request"> <part name="parameters" element="ns:method"/> </wsdl:message> ... <wsdl:operation name="method" > <input message="request" /> ... Message: <soap:body> <ns:method> <a>ABC</a> <c>123</a> <ns:method> </soap:body>
RPC/ENCODED WSDL: <xsd:element name="c" type="xsd:int" /> ... <wsdl:message name="request"> <part name="a" type="xsd:string" /> <part name="b" element="ns:c" /> </wsdl:message> ... <wsdl:operation name="method" > <input message="request" /> ... Message: <soap:body> <ns:method> <a xsi:type="xsd:string">ABC</a> <element attribute is not allowed in rpc/encoded mode> </ns:method> </soap:body>
DOCUMENT/LITERAL not wrapped WSDL: <xsd:element name="c" type="xsd:int" /> ... <wsdl:message name="request"> <part name="a" type="xsd:string" /> <part name="b" element="ns:c" /> </wsdl:message> ... <wsdl:operation name="method" > <input message="request" /> ... Message: <soap:body> <a>ABC</a> <c>123</a> </soap:body>