XML スキーマでは、ワイルドカードの <xsd:any> 要素を利用することによって、スキーマが指定していない要素で複合型を拡張することができます。この <xsd:any> 要素は、実際にはスキーマで複合型の内容を定義する必要がない場合にも役立つことがあります。たとえばサービスオペレーションで複数の型の注文書 XML ドキュメントを受信する可能性があり、注文書のそれぞれに異なるスキーマが定義されている状況を考えてみましょうj。この場合は、サービスインタフェースで要素の注文書ドキュメント型を <any> と記述すると便利です。そうすることによってエンドポイントの汎用性が増します。このことはまた、サービス実装コードが、自身が受け取る XML ドキュメントの型を特定し、その型に応じて XML ドキュメントを正しく処理する必要があることを意味します。<any> を利用することによってサービスオペレーションの汎用性が増すため、作成するコードで対処できる必要があります。コード例 1 の WSDL ファイルに、<any> 要素を含む、型 submitPO が定義されていることに注意してください。これは、別の要素宣言内に <any> をラップしているようなものです。この submitPO 型は、オペレーションが注文書を送信する際に、サービスインタフェース内で使用されます。(要素名の submitPO とオペレーション名 submitPO が同じであることに注意してください。これは、単に、WSDL で、これらの名前の一致規則の指定に、ラップされたスタイルを使用しているためです)。このサービスの XML では、受信するドキュメントに任意の要素を持たせることができます。
<complexType name="submitPO">
<sequence>
<any/>
</sequence>
</complexType>
<element name="submitPO" type="tns:submitPO"/>
</schema>
</types>
<message name="AnyPurchaseOrderServiceSEI_submitPO">
<part name="parameters" element="tns:submitPO"/>
</message>
...
<portType name="AnyPurchaseOrderServiceSEI">
<operation name="submitPO">
<input message="tns:AnyPurchaseOrderServiceSEI_submitPO"/>
...
</operation>
</portType>
コード例 1: サービスオペレーションの入力パラメータでの <any> の使用法を示す WSDL コード例
JAX-RPC では、xsd:any スキーマ型要素を使用して要素ワイルドカードが表わされている場合、この複合型のマッピングは JavaBeans[tm] コンポーネントにマッピングされます。maxOccurs=1 の <any> 要素が存在すると、_any という追加のプロパティーが生成され、1 つの javax.xml.soap.SOAPElement にマッピングされます (maxOccurs が 1 より大きい場合は、javax.xml.soap.SOAPElement の配列にマッピングされる)。また、JAX-RPC では、XML スキーマ型に対する標準の Java マッピングがない場合、リテラル表現を持つメッセージ部は、XML ドキュメントフラグメントと見なされ、マッピングされます。XML と Java 間のマッピングでは、インタフェース javax.xml.soap.SOAPElement を使用して、wsdl:operation 要素の Java マッピングでリテラルメッセージ部を表します。このため、受信するドキュメントに <any> を使用しているコード例 1 に示すような WSDL ファイルから Java インタフェースを生成すると、コード例 2 に示すような type SubmitPO 型のラッパークラスがJava インタフェースに含まれることがあります。この場合、このインタフェースの Java 実装では、SubmitPO パラメータで取得メソッド get_any()
を呼び出して、中にラップされている SOAPElement を取得する必要があります。この追加の呼び出しステップは少し不便ですが、大きな問題ではありません。
public interface AnyPurchaseOrderServiceSEI extends Remote {
public SubmitPOResponse submitPO(SubmitPO parameters) throws
InvalidPOException, java.rmi.RemoteException;
}