アプリケーション固有情報機能の使用

オブジェクト・レベルおよび属性レベルのアプリケーション固有情報 (ASI) を指定して、SOAP データ・ハンドラー機能を拡張および強化することができます。表 46 に、これらの属性を示します。各属性については、以下のセクションで説明します。表の項目はすべて、特に明記されていない限り、属性レベルの ASI です。

表 46. SOAP オブジェクト ASI の要約
ASI 指定可能な値 説明
soap_location SOAPHeader このビジネス・オブジェクト属性をヘッダー属性として指定します。
headerfault ストリング 障害ビジネス・オブジェクト内の対応する SOAP ヘッダーのビジネス・オブジェクト属性名を指定します。
elem_name ストリング このビジネス・オブジェクト属性に対応する SOAP 要素の名前を指定します。
elem_ns ストリング このビジネス・オブジェクト属性に対応する SOAP 要素のネーム・スペースを指定します。
type_name ストリング このビジネス・オブジェクト属性に対応する SOAP 要素の型を指定します。
type_ns ストリング このビジネス・オブジェクト属性に対応する要素の型ネーム・スペースを指定します。
xsdtype true このビジネス・オブジェクト属性に対応する要素の型ネーム・スペースとして xsd を指定し、古いバージョンの xsd (1999、2000 など) を最新バージョンの xsd (2001 など) でオーバーライドします。
attr_name ストリング このビジネス・オブジェクト属性に対応する SOAP 属性の名前を指定します。
attr_ns ストリング このビジネス・オブジェクト属性に対応する SOAP 属性のネーム・スペースを指定します。
arrayof ストリング この要素の配列を作成するために使用する必要のある、n カーディナリティーの子ビジネス・オブジェクト属性の名前を指定します。
dh_mimetype ストリング この複合型の属性を変換するために使用される、データ・ハンドラーの mimeType を指定します。
cw_mo_* ストリング このビジネス・オブジェクト・レベルの ASI では、SOAP データ・ハンドラーによって内容ではなくメタデータとして解釈される、子構成 MO の名前を指定します。メタデータとして処理される子構成 MO を指定する値は、cw_mo_soap のみです。それ以外のすべての cw_mo_* は、別のコンポーネントを表すため、SOAP データ・ハンドラーの処理対象から除外されます。他の cw_mo* はすべて無視されます。
cw_mo_soap ストリング このビジネス・オブジェクト・レベルの ASI では、このビジネス・オブジェクトを変換するときに使用する必要のある、子構成 MO 属性の名前を指定します。
cw_mo_jms ストリング このビジネス・オブジェクト・レベルの ASI では、使用する JMS プロトコル構成 MO の名前を指定します。
cw_mo_http ストリング このビジネス・オブジェクト・レベルの ASI では、使用する HTTP プロトコル構成 MO の名前を指定します。
wrapper true このビジネス・オブジェクト内のラッパー・オブジェクトの属性名を指定します。ラッパー・オブジェクトは特定のスキーマ標識で使用され、直列化してはなりません。
maxoccurs 整数 このビジネス・オブジェクト属性について出現可能な、最大オカレンス件数を指定します。maxoccurs の値によって、ビジネス・オブジェクトにラッパーを含められる場合と、含められない場合があります。
minoccurs 整数 このビジネス・オブジェクト属性について可能な、最小オカレンス件数を指定します。minoccurs の値によって、ビジネス・オブジェクトにラッパーを含められる場合と、含められない場合があります。
all ストリング スキーマの all 標識を表す子属性を指定します。
choice ストリング スキーマの choice 標識を表す子属性を指定します。

ビジネス・オブジェクトから SOAP メッセージへの変換における ASI

SOAP データ・ハンドラーは、SOAP メッセージの構成方法を決定するために、ビジネス・オブジェクトの ASI を使用します。別の指示が示されていないかぎり、以下のセクションで述べるすべての ASI は属性レベルの ASI を表し、ストリング・ベースでの比較はすべて、大文字小文字を区別しないで行われます。

elem_name および elem_ns の処理

このセクションで示す例では、属性名が OrderId であって、SOAP 要素ネーム・スペースの接頭部が ns0 であると想定されています。

  1. elem_name も elem_ns も指定されていない場合、elem_name のデフォルト値としては属性名が使用され、elem_ns のデフォルト値としては要素の親のネーム・スペースが使用されます。ASI は指定されません。

    <OrderId>1</OrderId>
     
  2. elem_name が指定され、elem_ns が指定されていない場合、elem_name は ASI の elem_name 値に設定され、elem_ns についてはデフォルト値として SOAP 本文のネーム・スペースが使用されます。ASI は以下のようになります。

    elem_name=CustOrderId
     <CustOrderId>2</CustOrderId>
     
  3. elem_ns が指定され、elem_name が指定されていない場合、elem_name についてはデフォルト値として属性名が使用され、elem_ns は ASI の elem_ns 値に設定されます。xmlns 属性が明示的に書き込まれるのは、この要素のスコープ内における他のどの個所にも要素ネーム・スペースが見付からない場合のみです。要素ネーム・スペースが検出された場合には、すでに定義されているネーム・スペースの接頭部が使用されます。それ以外の場合 (要素ネーム・スペースが見付からない場合)、elem_ns のための固有の接頭部が生成されます。次の例では、スコープ内で接頭部がすでに定義されているものと想定しています (ns1 は、この要素のスコープ内ですでに定義されているネーム・スペースに対応する接頭部を表します)。ASI は以下のようになります。

    elem_ns= http://www.w3.org/2001/XMLSchema
     <ns1:OrderId>3</ns1:OrderId>
     

    次の例では、接頭部が見付からない場合が想定されています (ns2 は固有の接頭部を表します)。ASI は以下のようになります。

    elem_ns=CustOrderIdNamespace
     <ns2:OrderId xmlns:ns2="CustOrderIdNamespace">3</ns2:OrderId>
     
  4. elem_name と elem_ns の両方が指定されている場合、elem_name および elem_ns は、ASI の値に設定されます。すでに定義されているネーム・スペースに関しては、上記 3 の場合と同じ検査が行われます。3 の場合と同様に、ネーム・スペースがまだ定義されていない場合には、elem_ns のために固有の接頭部が生成されます。ASI は以下のようになります。

    elem_name=CustOrderId;elem_ns=CustOrderIdNamespace
     <ns2:CustOrderId xmlns:ns2="CustOrderIdNamespace">1</ns2:OrderId>
     

単純属性の場合の type_name および type_ns の処理

このセクションの例では、属性名は OrderId、SOAP 要素ネーム・スペースの接頭部は ns0、そして属性タイプは String になっています。

注:
type_name および type_ns の処理は、構成 MO の属性 TypeInfo が true になっている場合にのみ行われます。
  1. type_name も type_ns も指定されていない場合、type_name のデフォルト値として単純型が使用され、type_ns のデフォルト値として、xml スキーマで定義されたネーム・スペース (xsd) が使用されます。ASI は指定されません。

    <OrderId xsi:type="xsd:string">1</OrderId>
     
  2. type_name が指定され、type_ns が指定されていない場合、type_name は ASI の type_name 値に設定され、type_ns についてはデフォルト値として要素のネーム・スペースが使用されます。ASI は以下のようになります。

    type_name=CustString
     <OrderId xsi:type="ns0:CustString">2</OrderId>
     
  3. type_ns が指定され、type_name が指定されていない場合、type_ns のデフォルト値として単純型名が使用され、type_name は ASI の type_ns 値に設定されます。この接頭部は、elem_ns の作成に準じた方法で処理されます。要素スコープ内にその型ネーム・スペースがすでに存在している場合を除き、型ネーム・スペースのために固有の接頭部が生成されます。ASI は以下のようになります。

    type_ns=CustStringNamespace
     <OrderId xmlns:ns2="CustStringNamespace" xsi:type=
     "ns2:String">3</OrderId>
     
  4. type_name と type_ns の両方が指定されている場合、これらは、割り当てられた ASI 値に設定されます。型ネーム・スペースのために固有の接頭部が生成されます。ASI は以下のようになります。

    type_name=CustString;type_ns=CustStringNamespace
     <OrderId xmlns:ns2="CustStringNamespace" xsi:type=
     "ns2:CustString">1</OrderId>
     

単一カーディナリティー属性の場合の type_name および type_ns の処理

このセクションの例では、属性名は OrderStaus、SOAP 要素ネーム・スペースの接頭部は ns0、そして属性タイプは OrderStatus になっています。

注:
type_name および type_ns の処理は、構成 MO の属性 TypeInfo が true になっている場合にのみ行われます。
  1. type_name も type_ns も指定されていない場合、type_name のデフォルト値としてビジネス・オブジェクト名が使用され、型ネーム・スペースのデフォルト値として要素のネーム・スペースが使用されます。ASI は指定されません。
    <OrderStatus  xsi:type="ns0:OrderStatus">1</OrderStatus>
     
  2. type_name が指定され、type_ns が指定されていない場合、type_name は割り当てられた ASI の値に設定され、type_ns については、デフォルト値として要素のネーム・スペースが使用されます。ASI は以下のようになります。

    type_name=CustOrderStatus
     <OrderStatus  xsi:type="ns0:CustOrderStatus">1</OrderStatus>
     
  3. type_ns が指定され、type_name が指定されていない場合、type_name のデフォルト値としてビジネス・オブジェクト名が使用され、type_ns は割り当てられた type_ns 値に設定されます。型ネーム・スペースのために固有の接頭部が生成されます。ASI は以下のようになります。

    type_ns=CustTypeNS
     <OrderStatus  xsi:type="ns2:SOAP_OrderStatusLine
     " xmlns:ns2="CustTypeNS">1</OrderStatus>
     
  4. type_name と type_ns の両方が指定されている場合、これらは、割り当てられた ASI 値に設定されます。型ネーム・スペースのために固有の接頭部が生成されます。ASI は以下のようになります。

    type_name=CustOrderStatus;type_ns=CustTypeNS
     <OrderStatus 
     xsi:type="ns2:CustOrderStatus" xmlns:ns2="CustTypeNS">1</OrderStatus>
     

複数カーディナリティー属性の場合の type_name および type_ns の処理

このセクションで示すすべての例では、属性名が MultiLines であって、SOAP 要素ネーム・スペースの接頭部が ns0 であると想定されています。属性タイプは OrderStatus であるものとします。

注:
type_name および type_ns の処理は、構成 MO の属性 TypeInfo が true になっている場合にのみ行われます。
  1. type_name も type_ns も指定されていない場合、type_name のデフォルト値としてビジネス・オブジェクト名が使用され、type_ns のデフォルト値として要素のネーム・スペースが使用されます。ASI は以下のようになります。

    <MultiLines SOAP-ENC:arrayType="ns0:OrderStatus[2]" 
     xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" 
     xsi:type="SOAP-ENC:Array">
     
  2. type_name が指定され、type_ns が指定されていない場合、type_name は、割り当てられた ASI の type_name 値に設定され、type_ns については、デフォルト値として要素のネーム・スペースが使用されます。ASI は以下のようになります。

    type_name=CustOrderStatus
     <MultiLines SOAP-ENC:arrayType="ns0:CustOrderStatus[2]" 
     xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" 
     xsi:type="SOAP-ENC:Array">
     
  3. type_ns が指定され、type_name が指定されていない場合、type_name のデフォルト値としてビジネス・オブジェクト名が使用され、type_ns は、割り当てられた ASI の type_ns 値に設定されます。型ネーム・スペースのために固有の接頭部が生成されます。ASI は以下のようになります。

    type_ns=CustTypeNS
     <MultiLines SOAP-ENC:arrayType="ns2:OrderStatus[2]" 
     xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/
     " xmlns:ns2="CustTypeNS" xsi:type="SOAP-ENC:Array">
     
  4. type_name と type_ns の両方が指定されている場合、これらは、割り当てられた ASI 値に設定されます。型ネーム・スペースのために固有の接頭部が生成されます。ASI は以下のようになります。

    type_name=CustOrderStatus;type_ns=CustTypeNS
     <MultiLines SOAP-ENC:arrayType="ns2:CustOrderStatus[2
     ]" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" 
     xmlns:ns2="CustTypeNS" xsi:type="SOAP-ENC:Array">
     

注:
各 Array 要素の親を表す項目要素の型およびネーム・スペースは、arrayType と同じです。

単純型、単一カーディナリティー型、および複数カーディナリティー型の場合の xsdtype

単純型、単一カーディナリティー型、および複数カーディナリティー型の場合、型名が SOAP メッセージの現行 XSD に従うときには、xsdtype ASI 属性を true に設定してください。xsdtype プロパティーが読み取られるのは、type_name と type_ns の両方のプロパティーが設定されている場合のみです。type_name および type_ns が指定された場合、SOAP データ・ハンドラーは、最初に、SOAP API を使用してそれらのペアを Java 型にマップすることを試みます。データ・ハンドラーは、その後で、SOAP メッセージのための現行 XSD を使用して、Java 型を SOAP 要素型に変換することを試みます。例えば、現行 XSD が以下のとおりであって

http://www.w3.org/2001/XMLSchema
 

ASI が以下のとおりである場合、

type_name=timeInstant;type_ns=http://www.w3.org/1999/XMLSchema;xsdtype=true
 

SOAP メッセージ型名は次のように書かれます。


<OrderDate xsi:type="xsd:dateTime">
 

これは、2001 XSD における dateTime が、1999 XSD における timeInstant と同等であるためです。

xsdtype および単純型の配列

複数カーディナリティー・オブジェクトの場合、次のような単純型の配列を作成することができます。

<MultiLines SOAP-ENC:arrayType="xsd:string[4]" 
 xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" 
 xsi:type="SOAP-ENC:Array">
 

そのためには、type_name プロパティーを、希望する単純型 (例えば、string) に設定し、type_ns プロパティーを適切な XSD 仕様に設定してください。その後で、xsdtype プロパティーを true に設定して、この型が現行の XSD 型に変換されるようにしてください。最後に、arrayOf プロパティーを、単純型値を保持すべきコンテナー内の属性の名前に設定する必要があります。ストリング配列の場合の ASI の例を次に示します。

arrayof=size;type_name=string;type_ns=
 http://www.w3.org/2001/XMLSchema;
 xsdtype=true
 

障害処理における ASI の効果

faultcode、faultactor、faultstring、および detail の各要素は、以下の規則に従います。

  1. これらの属性における elem_name、elem_ns、type_name、および type_ns ASI は無視されます。
  2. detail 要素のすべての子は、本文処理の説明で述べたとおりに書かれます。

ヘッダー処理における ASI の効果

ヘッダーの子オブジェクトのレベルおよびそれ以下では、すべての ASI プロパティー (表 46 を参照) を使用することができます。

SOAP 属性の指定

単純型の場合の attr_name の処理

これはサポートされていません。SOAP 属性を作成するためには、ビジネス・オブジェクト属性が複合 (1 または n カーディナリティー) 型になっていなければなりません。

単一カーディナリティー型および複数カーディナリティー型の場合の attr_name の処理

ビジネス・オブジェクト属性を SOAP 要素ではなく SOAP 属性に変換する ASI を指定することができます。データ・ハンドラーは、単一および n カーディナリティーの複合型に対してのみ SOAP 属性の追加をサポートしています。次の例について考えてみましょう。

<CustInfo City="4" State="5" Street="2" Zip="6">
    <Name xsi:type="xsd:string">1</Name>
    <Street2 xsi:type="xsd:string">3</Street2>
 </CustInfo>
 

このビジネス・オブジェクト定義構造 (図 45 の各属性の右側に属性レベル ASI が指定されています) の場合、データ・ハンドラーは以下の処理ステップに従います。

図 45. attr_name ビジネス・オブジェクト


  1. データ・ハンドラーは、複合属性全体を探索する際に、まず、この複合ビジネス・オブジェクト属性に対応するタグを生成します。この例では、CustInfo が複合ビジネス・オブジェクト属性を表します。
  2. データ・ハンドラーは、複合ビジネス・オブジェクトの複数の子について繰り返し処理を行います。属性を作成する際に考慮されるのは、単純型属性のみです。ある単純型の ASI プロパティーの名前が attr_name である場合、データ・ハンドラーはこの単純型を SOAP 要素の属性として記述します。この例では、要素 (CustInfo) には Street、City、State、および Zip の 4 つの属性があります。
  3. ビジネス・オブジェクトのそれ以外の属性は、標準的な BODY 処理を使用して記述されます。これはつまり、関係のあるすべての ASI が、attr_name ASI を持たないビジネス・オブジェクト属性に対しても評価されるということです。

複数カーディナリティー型を処理する際のロジックは、単一カーディナリティー型を処理するロジックと同じです。具体的には、それぞれの <item> タグは複数カーディナリティー・オブジェクトにおける各ビジネス・オブジェクト・インスタンスに対応し、ASI を使用して処理されます。例えば、この複数カーディナリティー・ビジネス・オブジェクト定義構造に、対応する ASI があるとします。

図 46. attr_name 複数カーディナリティー・ビジネス・オブジェクト


データ・ハンドラーに送られたイベントに、この複数カーディナリティー・オブジェクトのインスタンスが 2 つ含まれている場合、次のような SOAP メッセージが作成されます。

<CustInfo>
    <item City="Armonk" Street="Main Street">
       <Name>IBM</Name>
       <Street2>None</Street2>
    </item>
    <item City="Burlingame" State="Ca"
    Street="577 Airport Blvd" Zip="94010">
       <Name>Burlingame Labs</Name>
       <Street2>Suite 600</Street2>
    </item>
 </CustInfo>
 

item タグが複合要素型として扱われることに注意してください。ビジネス・オブジェクト定義に含まれている属性は、対応する item タグの SOAP 属性になります。

arrayof の処理

ASI プロパティー arrayof は、SOAP 属性を (child タグで使用するのではなく) 配列要素自体に割り当てるために使用します。単一カーディナリティーの複合型の ASI に arrayof プロパティーを追加してください。arrayof プロパティーの値は、SOAP メッセージで表される複数カーディナリティーの子の名前でなければなりません。SOAP メッセージが作成されると、複数カーディナリティーの子は、その配列の child タグを表すようになります。

arrayof 要素とそれに対応する ASI によるビジネス・オブジェクト定義が、図 47 に示されています。

図 47. arrayof ビジネス・オブジェクト


データ・ハンドラーに送られたイベントに、このカーディナリティー n オブジェクトのインスタンスが 2 つ含まれている場合、次のような SOAP メッセージが作成されます。

<Customer ID="12">
    <CustInfo City="4" State="5" Street="2" Zip="6">
       <Name>1</Name>
       <Street2>3</Street2>
    </CustInfo>
    <CustInfo City="10" State="11" Street="8" Zip="12">
       <Name>7</Name>
       <Street2>9</Street2>
    </CustInfo>
 </Customer>
 

arrayof プロパティーを使用すると、item 以外の名前の配列項目を作成できることに注目してください。この例では、item タグが CustInfo タグに置き換えられています。この要素名は、ASI プロパティー arrayof が指すビジネス・オブジェクト属性の名前から派生したものです。

attr_name および attr_ns の処理

作成される SOAP 属性に対応したネーム・スペースを指定することをお勧めします。そのためには、単純型の場合には ASI プロパティー attr_ns を指定します。データ・ハンドラーが attr_ns プロパティーを処理するのは、同じ属性の ASI に attr_name が存在する場合のみです。attr_name および attr_ns には、以下の規則が適用されます。

  1. attr_name も attr_ns も設定されていない場合には、ビジネス・オブジェクト属性は SOAP 要素に変換されます。
  2. attr_name のみが設定されている場合には、SOAP 属性のネーム・スペースのデフォルト値として、その要素のネーム・スペースが使用されます。

    <CustInfo Street="577 Airport"></CustomerInfo>
     
  3. attr_ns のみが設定されている場合には、このプロパティーは無視され、ビジネス・オブジェクト属性は SOAP 要素に変換されます。
  4. attr_name と attr_ns の両方が設定されている場合には、次のような SOAP 属性が作成されます。
    <CustInfo ns2:Street="577 Airport" xmlns:ns2=
     "AttrNS"></CustomerInfo>
     

dh_mimetype: データ・ハンドラーの呼び出し

SOAP データ・ハンドラーを使用して別のデータ・ハンドラーを呼び出し、ビジネス・オブジェクトを、対応するデータ・ハンドラーが存在する任意の形式に書き出すことができます。これは、SOAP 子ビジネス・オブジェクトを SOAP ストリングに変換するときに、エンコードされたテキストを SOAP メッセージに追加することによって行います。

SOAP 要素の値をエンコードすることのできるフォーマットの 1 つに、RNIF 文書があります。この機能を使用するためには、任意のレベルの SOAP 子ビジネス・オブジェクトに RNIF BO を追加してください。この RNIF ビジネス・オブジェクトをストリングに変換するときに別のデータ・ハンドラーを呼び出すように SOAP データ・ハンドラーに通知するためには、その属性の ASI に dh_mimetype プロパティーを追加します。ASI プロパティー dh_mimetype の値は、MO_DataHandler_Default メタオブジェクトで指定された適格な mimeType でなければなりません。この mimeType は、ビジネス・オブジェクトを処理するために呼び出すデータ・ハンドラーを判別するために使用されます。

図 48 に示す SOAP 子ビジネス・オブジェクトでは、CustomerInfo は複合子であり、RNET_Pip3A2PriceAndAvailabilityQuery は RNIF ビジネス・オブジェクトになっています。

図 48. dh_mimetype を有する RNIF ビジネス・オブジェクト


このビジネス・オブジェクトから作成される SOAP メッセージは、次のようになります。

<CustomerInfo>
 <Name>IBM Corporation</Name>
 <CustID>95626</CustID>
 <RNIFexample
 xsi:type="xsd:base64Binary">1AWERYER238W98EYR9238728374871892787ASRJK23423
 JKAWERJ234AWERIJHI423488R4HASF1AWERYER238W98EYR9238728374871892787ASRJK234
 34JKAWERJ234AWERIJHI423488R4HASF1AWERYER238W98EYR9238728374871892787ASRJK2
 4234JKAWERJ234AWERIJHI423488R4HASF1AWERYER238W98EYR9238728374871892787ASRJ
 234234JKAWERJ234AWERIJHI423488R4HASFWR234
 </RNIFexample>
 </CustomerInfo>
 

RNIF サンプル要素には RNIF エンコード・ストリングが含まれていますが、これは、その要素値としてエンコードされた base64 バイナリーだったものです。また、ASI プロパティー elem_name、elem_ns、type_name、type_ns、および xsdtype は、このビジネス・オブジェクト属性との関係を維持します。この例では、メッセージが作成されると、指定された elem_name が SOAP 要素の名前になります。

注:
呼び出し先のデータ・ハンドラーによって戻される要素値がエンコード・テキストである場合には、type_name プロパティーは base64Binary に設定されていなければならず、type_ns は xsd ネーム・スペースに対応していなければならず、また xsdtype は true に設定されていなければなりません。

xsd:base64Binary

type_name および type_ns を xsd:base64Binary に解決されるように設定すると、SOAP データ・ハンドラーは、対応する要素の値を設定する前に、ビジネス・オブジェクトから得られた値をエンコードします。データ・ハンドラーは Apache API を使用してレジストリーに対して base64Binary シリアライザーの照会を行い、呼び出し先データ・ハンドラーから戻されたストリングをシリアライズし、要素の値を設定します。

スキーマ complexType の標識

以下のセクションでは、スキーマ complexType の標識がビジネス・オブジェクトに与える影響について説明します。標識には以下のものがあります。

単純型の場合の maxOccurs および minOccurs 標識

maxOccurs 標識は、1 つの複合型の中である要素が出現することのできる、最大回数を表します。 minOccurs 標識は、1 つの複合型の中である要素が出現する必要のある、最小回数を表します。

次のスキーマを検討してください。

<xs:element name="Address" type="Address">
 <xs:complexType name="Address">
      <xs:sequence>
         <xs:element name="AddressLine" type="xsd:string" maxOccurs="10"/>
         <xs:element name="SuiteNumber" type="xsd:string" minOccurs="3"
                              maxoccurs="unbounded"/>
         <xs:element name="City" type="xsd:string"/>
      </xs:sequence>
      </xs:complexType>
 </xs:element>
 

上の例では、Address 要素内で AddressLine 要素が最大 10 回出現することができ、SuiteNumber 要素が少なくとも 3 回出現することを示しています。このスキーマに対応するビジネス・オブジェクトでは、次の ASI を備えたそれぞれの maxoccurs/minoccurs 標識ごとに、N カーディナリティーのラッパー・オブジェクトが 1 つ存在しなければなりません。

maxOccurs=N;wrapper=true
 

または

minOccurs=3;wrapper=true;
 

wrapper=true ASI は、このオブジェクトがラッパーであること、およびその理由から、SOAP メッセージに明示的に書き込まれないことを示しています。明示的な書き込みが行われないため、このラッパー・オブジェクトには、単純型の子が 1 つ存在しなければなりません。実行時に SOAP からビジネス・オブジェクトへの変換を行うために、データ・ハンドラーは、ラッパーの子オブジェクトを N 個読み取り、それぞれの子オブジェクトごとに対応する要素を作成します。ビジネス・オブジェクトから SOAP メッセージへの変換を行う際には、データ・ハンドラーは、検出されたそれぞれの要素ごとに、N カーディナリティー・ラッパー内に子オブジェクトを作成します。

これに対応する SOAP ビジネス・オブジェクトは、図 49 のようなものとなります。

図 49. SOAP ビジネス・オブジェクトにおける単純型 ASI の minOccurs および maxOccurs


図 49 に示したビジネス・オブジェクトに対応する SOAP メッセージは、次のようになります。

<Address xsi:type="ns0:Address">
     <AddressLine xsi:type="xsd:string">Line1</AddressLine>
     <AddressLine xsi:type="xsd:string">Line2</AddressLine>
     <SuiteNumber xsi:type="xsd:string">600</SuiteNumber>
     <SuiteNumber xsi:type="xsd:string">650</SuiteNumber>
     <SuiteNumber xsi:type="xsd:string">700</SuiteNumber>
      <City xsi:type="xsd:string">San Francisco</City>
 </Address>
 

注:
SOAP データ・ハンドラーは、maxOccurs 標識を処理する場合にも minOccurs 標識を処理する場合にも、要素の最大および最小出現回数を検証しません。データ・ハンドラーは、maxOccurs および minOccurs 標識を備えた特定の要素の複数のインスタンスを保持するためのコンテナー構造を提供するだけです。この方法は、単純型および複合型に適用されます。

複合型の場合の maxOccurs および minOccurs 標識

<maxOccurs> 標識は、1 つの複合型の中である要素が出現することのできる、最大回数を表します。<minOccurs> 標識は、1 つの複合型の中である要素が出現する必要のある、最小回数を表します。次のスキーマにおける maxOccurs 標識について検討してください。

<xs:element name="Address" type="Address">
 <xs:complexType name="Address">
      <xs:sequence>
      <xs:element name="AddressInfo" type="AddressInfo" maxOccurs="3"/>
      <xs:element name="City" type="xsd:string"/>
   </xs:sequence>
   </xs:complexType>
 </xs:element>
  
 <xs:complexType name="AddressInfo">
      <xs:sequence>
      <xs:element name="StreetLine" type="xsd:string"/>
      </xs:sequence>
   </xs:complexType>
 </xs:element>
 

上の例では、Address 要素内で AddressInfo 複合型要素が最大 3 回出現することができることを示しています。このスキーマに対応するビジネス・オブジェクトには、ラッパー・オブジェクトがありません。complexType の AddressInfo 自体が N カーディナリティーの要素になりうるためです。N カーディナリティーの属性には、maxoccurs=3 という ASI が含められます。

図 50 は、これに対応する SOAP ビジネス・オブジェクトを示しています。

図 50. SOAP ビジネス・オブジェクトにおける複合型 ASI の minOccurs および maxOccurs


図 50 に示したビジネス・オブジェクトに対応する SOAP メッセージは、次のようになります。

<Address xsi:type="ns0:Address">
      <AddressInfo xsi:type="ns0:AddressInfo">
         <StreetLine xsi:type="xsd:string">100 Market St.</ StreetLine>
         <StreetLine xsi:type="xsd:string">Apt 15</ StreetLine>
      </AddressInfo>
   <City xsi:type="xsd:string">San Francisco</City>
 </Address>
 

all 標識

all 標識は、デフォルトでは、この complexType に関する子要素を任意の順序で指定できること、およびそれぞれの子要素がゼロまたは 1 回出現しなければならないことを指定します。次のスキーマについて考えてみましょう。

<complexType name="Item">
      <all>
         <element name="quantity" type="xsd:int"/>
         <element name="product" type="xsd:string"/>
      </all>
 </complexType>
 

上記の例は、SOAP メッセージ内で要素 quantity および product を任意の順序で表示できることを示しています。quantity 要素を最初に表示して、product 要素を 2 番目に表示することも、逆の順序で表示することもできます。

図 51 は、このスキーマに対応するビジネス・オブジェクトを表しています。

図 51. SOAP ビジネス・オブジェクトにおける all 標識 ASI


対応する SOAP メッセージは次のようになります。

<Item xsi:type="ns0:Item">
     <quantity xsi:type="xsd:string">12</quantity>
     <product xsi:type="xsd:string">2</product>
 </Item>
 

sequence 標識

sequence 標識は、子要素が、complexType で指定されたとおりの順序で現れなければならないことを示します。

<complexType name="Item">
      <sequence>
         <element name="quantity" type="int"/>
         <element name="product" type="string"/>
      </sequence>
 </complexType>
 

SOAP データ・ハンドラーは、この標識のための特別な ASI またはラッパー・オブジェクトを必要としません。デフォルトでは、データ・ハンドラーは、ビジネス・オブジェクトで指定されたとおりの順序で SOAP 要素の読み取りおよび書き込みを行います。

choice 標識

choice 標識は、complexType 内の要素のうちの 1 つだけを SOAP メッセージに含めることができることを示します。次のスキーマについて考えてみましょう。

<complexType name="Item">
     <choice>
         <element name="quantity" type="int"/>
         <element name="product" type="string"/>
     </choice>
 </complexType>
 

SOAP データ・ハンドラーは、この標識のための特別な ASI またはラッパー・オブジェクトを必要としません。ビジネス・オブジェクトを SOAP メッセージに変換するときに、データ・ハンドラーは処理を中断し、SOAP メッセージにどの要素を含めるのかをユーザーが選択できるようにします。SOAP メッセージをビジネス・オブジェクトに変換するときには、データ・ハンドラーは既存の要素を読み取り、それに対応する属性を取り込みます。

SOAP からビジネス・オブジェクトへの変換における ASI

SOAP データ・ハンドラーは、受け取った SOAP メッセージを読み取って検証するために、ビジネス・オブジェクトの ASI を使用します。SOAP データ・ハンドラーによる ASI の検証には、以下の規則が適用されます。

注:
別の指示が示されていないかぎり、以下のセクションで述べるすべての ASI は属性レベルの ASI です。

elem_name の検証

単純、カーディナリティー 1、およびカーディナリティー n の属性の検証には、以下の規則が適用されます。

  1. SOAP メッセージの構文解析中に要素が検出された場合、データ・ハンドラーは最初にビジネス・オブジェクト・レベルのすべての ASI を検索し、その要素の名前と elem_name 値の突き合わせを行います。
  2. 要素の名前と elem_name 値が一致しない場合、データ・ハンドラーは、要素の名前を、そのビジネス・オブジェクト・レベルのそれぞれの属性名と突き合わせます。
  3. どちらの検索も成功しなかった場合、データ・ハンドラーは失敗します。

elem_ns の検証

単純、カーディナリティー 1、およびカーディナリティー n の属性の検証には、以下のケースが当てはまります。

  1. elem_ns ASI も、この要素に関する SOAP メッセージから得られる xmlns も存在しない場合、この要素が適切に検証されます。
  2. elem_ns ASI が存在せず、それに対応する SOAP メッセージ内の要素で xmlns が指定されている場合、データ・ハンドラーはデフォルトの elem_ns として、ビジネス・オブジェクトから最後に読み取った、スコープ内にある elem_ns を使用します。データ・ハンドラーはこの値を、SOAP メッセージから得られた xmlns と比較します。両者が一致しない場合、検証は失敗します。
  3. elem_ns ASI が存在し、それに対応する SOAP メッセージ内の要素で xmlns が指定されていない場合、データ・ハンドラーは、ASI で指定されている elem_ns が、SOAP メッセージの現行スコープ内のいずれかのネーム・スペースと一致するかどうかを調べます。両者が一致しない場合、検証は失敗します。

type_name および type_ns の検証

以下のセクションでは、type_name および type_ns の検証について説明します。

単純属性

xsdType が true の場合、type_name および type_ns の検証には以下の規則が適用されます。

xsdType が false の場合、type_name および type_ns の検証には以下の規則が適用されます。

複合属性 (カーディナリティー 1 および n)

xsdType が true の場合、type_name および type_ns の検証には以下の規則が適用されます。

xsdType が false の場合、type_name および type_ns の検証には以下の規則が適用されます。

attr_name および attr_ns の検証

SOAP メッセージをビジネス・オブジェクトに読み込む際には、SOAP 属性を探すために個々の SOAP 要素が検索されます。SOAP 属性が検出された場合は、対応するビジネス・オブジェクトから得られた attr_name プロパティー値と比較されます。例えば、次の SOAP メッセージについて考えてみましょう。

<CustInfo City="4" State="5" Street="2" Zip="6">
    <Name xsi:type="xsd:string">1</Name>
    <Street2 xsi:type="xsd:string">3</Street2>
 </CustInfo>
 

ここで、図 52 に示すビジネス・オブジェクト定義構造について考えてみます (各属性の右に属性レベル ASI が指定されています)。

図 52. attr_name および attr_ns の検証


データ・ハンドラーは以下の処理ステップに従います。

  1. 要素名 CustInfo を読み取ります。
  2. この要素名に対応するビジネス・オブジェクト属性を解決します。
  3. SOAP 要素の属性を読み取り、それらを子属性の ASI と突き合わせます。この例では、SOAP メッセージの Street とビジネス・オブジェクト属性 Street1 の突き合わせ、City とビジネス・オブジェクト属性 City の突き合わせ、さらに、以下同様の突き合わせが行われます。
  4. CustInfo の子要素が、本文の残りの部分と同じ方法で読み取られ、処理されます。

注:
attr_ns の検証は行われません。

データ・ハンドラーは、所定の要素の SOAP 属性について繰り返し処理を行います。属性に出会うたびに、データ・ハンドラーは、対応する属性のためのビジネス・オブジェクトを検索します。ビジネス・オブジェクトが見付かったら、そのビジネス・オブジェクト属性に SOAP 属性の値を取り込みます。対応するビジネス・オブジェクト属性が見付からない場合、データ・ハンドラーは次の SOAP 属性に移って処理を続けます。

SOAP データ・ハンドラー内部からのデータ・ハンドラーの呼び出し

SOAP データ・ハンドラーは、別のデータ・ハンドラーを使用して、エンコードされた要素値を、SOAP メッセージからビジネス・オブジェクトに読み込むことができます。例えば、SOAP 要素の値がエンコードされるフォーマットの 1 つに、RNIF 文書があります。この機能を使用するためには、RNIF ビジネス・オブジェクトを任意のレベルの SOAP 子ビジネス・オブジェクトに追加します。この RNIF エンコード・ストリングを RNIF ビジネス・オブジェクトに変換するときに別のデータ・ハンドラーを使用しなければならないことを SOAP データ・ハンドラーに通知するためには、その属性の ASI に dh_mimetype プロパティーを追加する必要があります。dh_mimetype ASI の値は、MO_DataHandler_Default ビジネス・オブジェクトで指定された適格な mimeType でなければなりません。mimeType は、ストリング上で使用するデータ・ハンドラーを判別するために使用されます。例えば、次の SOAP メッセージでは、RNIFExample が SOAP 要素で、ここには RNIF エンコード・ストリングが含まれています。

<CustInfo>
 <Name>IBM Corporation</Name>
 <CustID>95626</CustID>
 <RNIFexample xsi:type="xsd:base64Binary">
 1AWERYER238W98EYR9238728374871892787ASRJK234234JKAWER
 J234AWERIJHI423488R4HASF1AWERYER238W98EYR923872837487
 1892787ASRJK234234JKAWERJ234AWERIJHI423488R4HASF1AWER
 YER238W98EYR9238728374871892787ASRJK234234JKAWERJ234A
 WERIJHI423488R4HASF1AWERYER238W98EYR92387283748718927
 87ASRJK234234JKAWERJ234AWERIJHI423488R4HASFWR234
 </RNIFexample>
 </CustomerInfo>
  
 

SOAP ビジネス・オブジェクトは、図 53 のようなものとなります。

図 53. RNIFExample ビジネス・オブジェクト


RNIFExample 要素には、その要素値として RNIF エンコード・ストリングが含まれています。また、ASI プロパティー elem_name、elem_ns、type_name、type_ns、および xsdtype は、このビジネス・オブジェクト属性との関係を依然として維持しています。

注:
呼び出し先のデータ・ハンドラーによって戻される要素値がエンコード・テキストである場合には、type_name プロパティーは base64Binary に設定されていなければならず、type_ns は xsd ネーム・スペースに対応していなければならず、また xsdtype は true に設定されていなければなりません。

デフォルトのビジネス・オブジェクト解決

SOAP からビジネス・オブジェクトへの変換では、SOAP データ・ハンドラーと Web サービス・コネクターは、情報を交換してビジネス・オブジェクト名を解決する特殊な契約に準拠しています。このコネクターは、SOAP データ・ハンドラーに、BodyName と BodyNamespace のペアにマップされるビジネス・オブジェクト名のリストを提供します。さらに、TLO に defaultfault ビジネス・オブジェクトが設定されている場合は、この情報がデータ・ハンドラーに渡されます。この情報が渡されると、SOAP データ・ハンドラーは、以下のステップに従って処理します。

  1. SOAP メッセージを受け取ります。
  2. そのメッセージが SOAP 要求メッセージか応答メッセージか、あるいは障害メッセージかを判断します。
    1. SOAP 要求メッセージまたは応答メッセージである場合は、SOAP-ENV:Body 要素の最初の子要素から、BodyName および BodyNamespace を読み取ります。
    2. SOAP 障害メッセージである場合は、その障害メッセージ内の detail 要素の最初の子要素から、BodyName および BodyNamespace を読み取ります。障害メッセージに detail 要素がない場合は、この変換用の defaultfault ビジネス・オブジェクトを使用します。
  3. defaultfault ビジネス・オブジェクトがまだ選択されていない場合、データ・ハンドラーは、ステップ 2 で検出した BodyName および BodyNamespace を、コネクターが提供するリストで検出されるペアと一致させようとします。一致させられれば、ビジネス・オブジェクトの解決は成功したことになります。一致しない場合、データ・ハンドラーは失敗し、失敗を意味するエラー・メッセージが出されます。

Copyright IBM Corp. 2004