オブジェクト・レベルおよび属性レベルのアプリケーション固有情報 (ASI) を指定して、SOAP データ・ハンドラー機能を拡張および強化することができます。表 46 に、これらの属性を示します。各属性については、以下のセクションで説明します。表の項目はすべて、特に明記されていない限り、属性レベルの ASI です。
ASI | 指定可能な値 | 説明 |
---|---|---|
soap_location | SOAPHeader | このビジネス・オブジェクト属性をヘッダー属性として指定します。 |
headerfault | String | 障害ビジネス・オブジェクト内の対応する SOAP ヘッダーの ビジネス・オブジェクト属性名を指定します。 |
elem_name | String | このビジネス・オブジェクト属性に対応する SOAP 要素の名前を指定します。 |
elem_ns | String | このビジネス・オブジェクト属性に対応する SOAP 要素のネーム・スペースを指定します。 |
type_name | String | このビジネス・オブジェクト属性に対応する SOAP 要素の型を指定します。 |
type_ns | String | このビジネス・オブジェクト属性に対応する要素の型ネーム・スペースを指定します。 |
xsdtype | true | このビジネス・オブジェクト属性に対応する要素の型ネーム・スペース として xsd を指定し、古いバージョンの xsd (1999、2000 など) を最新バージョンの xsd (2001 など) でオーバーライドします。 |
attr_name | String | このビジネス・オブジェクト属性に対応する SOAP 属性の名前を指定します。 |
attr_ns | String | このビジネス・オブジェクト属性に対応する SOAP 属性のネーム・スペースを指定します。 |
arrayof | String | 単純タイプ配列項目のプレースホルダーとして使用する必要のある、n カーディナリティー の子ビジネス・オブジェクト属性の名前を指定します。 |
dh_mimetype | String | この複合タイプの属性を変換するために使用される、データ・ハンドラー の mimeType を指定します。 |
cw_mo_* | String | このビジネス・オブジェクト・レベルの ASI では、SOAP データ・ハンドラー によって内容ではなくメタデータとして解釈される、子構成 MO の名前を指定します。メタデータとして処理される子構成 MO を指定する値は、cw_mo_soap のみです。それ以外のすべての cw_mo_* は、別のコンポーネントを表すため、SOAP データ・ハンドラーの処理対象から除外されます。他の cw_mo* はすべて無視されます。 |
cw_mo_soap | String | このビジネス・オブジェクト・レベルの ASI では、このビジネス・オブジェクトを変換するときに使用する必要のある、子構成 MO 属性の名前を指定します。 |
cw_mo_jms | String | このビジネス・オブジェクト・レベルの ASI では、使用する JMS プロトコル構成 MO の名前を指定します。 |
cw_mo_http | String | このビジネス・オブジェクト・レベルの ASI では、使用する HTTP プロトコル構成 MO の名前を指定します。 |
wrapper | true | このビジネス・オブジェクト内のラッパー・オブジェクトの 属性名を指定します。ラッパー・オブジェクトは特定のスキーマ標識で使用され、直列化してはなりません。 |
maxoccurs | Integer | このビジネス・オブジェクト属性について出現可能な、最大オカレンス件数を指定します。maxoccurs の値によって、ビジネス・オブジェクトにラッパーを含められる場合と、含められない場合があります。 |
minoccurs | Integer | このビジネス・オブジェクト属性について可能な、最小オカレンス件数を指定します。minoccurs の値によって、ビジネス・オブジェクトにラッパーを含められる場合と、含められない場合があります。 |
all | String | スキーマの all 標識を表す子属性を指定します。 |
choice | String | スキーマの choice 標識を表す子属性を指定します。 |
SOAP データ・ハンドラーは、SOAP メッセージの構成方法を 決定するために、ビジネス・オブジェクトの ASI を使用します。別の指示が示されていないかぎり、以下のセクションで述べるすべての ASI は 属性レベルの ASI を表し、ストリング・ベースでの比較はすべて、大/小文字を 区別しないで行われます。
このセクションで示す例では、属性名が OrderId であって、SOAP 要素ネーム・スペース の接頭部が ns0 であると想定されています。
<OrderId>1</OrderId>
elem_name=CustOrderId <CustOrderId>2</CustOrderId>
elem_ns= http://www.w3.org/2001/XMLSchema <ns1:OrderId>3</ns1:OrderId>
elem_ns=CustOrderIdNamespace <ns2:OrderId xmlns:ns2="CustOrderIdNamespace">3</ns2:OrderId>
elem_name=CustOrderId;elem_ns=CustOrderIdNamespace <ns2:CustOrderId xmlns:ns2="CustOrderIdNamespace">1</ns2:OrderId>
このセクションの例では、属性名は OrderId、SOAP 要素ネーム・スペースの接頭部は ns0、そして属性タイプは String になっています。
<OrderId xsi:type="xsd:string">1</OrderId>
type_name=CustString <OrderId xsi:type="ns0:CustString">2</OrderId>
type_ns=CustStringNamespace <OrderId xmlns:ns2="CustStringNamespace" xsi:type= "ns2:String">3</OrderId>
type_name=CustString;type_ns=CustStringNamespace <OrderId xmlns:ns2="CustStringNamespace" xsi:type= "ns2:CustString">1</OrderId>
このセクションの例では、属性名は OrderStaus、SOAP 要素ネーム・スペースの接頭部は ns0、そして属性タイプは OrderStatus になっています。
<OrderStatus xsi:type="ns0:OrderStatus">1</OrderStatus>
type_name=CustOrderStatus <OrderStatus xsi:type="ns0:CustOrderStatus">1</OrderStatus>
type_ns=CustTypeNS <OrderStatus xsi:type="ns2:SOAP_OrderStatusLine " xmlns:ns2="CustTypeNS">1</OrderStatus>
type_name=CustOrderStatus;type_ns=CustTypeNS <OrderStatus xsi:type="ns2:CustOrderStatus" xmlns:ns2="CustTypeNS">1</OrderStatus>
このセクションで示すすべての例では、属性名が MultiLines であって、SOAP 要素ネーム・スペース の接頭部が ns0 であると想定されています。属性タイプは OrderStatus であるものとします。
<MultiLines SOAP-ENC:arrayType="ns0:OrderStatus[2]" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="SOAP-ENC:Array">
type_name=CustOrderStatus <MultiLines SOAP-ENC:arrayType="ns0:CustOrderStatus[2]" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="SOAP-ENC:Array">
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">
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">
単純型、単一カーディナリティー型、および複数カーディナリティー型の場合、型名が 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 と 同等であるためです。
複数カーディナリティー・オブジェクトの場合、次のような単純型の配列を作成することができます。
<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
faultcode、faultactor、faultstring、および detail の各要素は、以下の規則に従います。
ヘッダーの子オブジェクトのレベルおよびそれ以下では、すべての ASI プロパティー (表 46 を参照) を使用することができます。
simpleContent 拡張または制限を持つ complexTypes が値と属性の両方を持っている XML スキーマの事例があります。例えば、次の SOAP タグがあるとします。
<size system="us">10</size>
これは、次のスキーマに基づいています。
<complexType name="SizeType"> <simpleContent> <extension base="int"> <attribute name="system" type="string"/> </extension> </simpleContent> </complexType> <element name="size" type="ns:SizeType"/>
複合タイプに対応する、単純コンテント拡張または制限を持つビジネス・オブジェクトは、複合タイプ属性に対応するその他の属性に加えて、1 つの追加属性を持っていなければなりません。追加属性は、単純コンテント値 (前述の例の場合は要素サイズの値 10) を持っていなければなりません。このような複合タイプに対応するビジネス・オブジェクトをタイプとして持っているビジネス・オブジェクト属性は、属性レベル ASI として elem_value=simpleContentValue を持ちます。
図 45 は、対応するビジネス・オブジェクトを示しています。
ビジネス・オブジェクト属性を 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>
このビジネス・オブジェクト定義構造 (図 46 の各属性の右側に属性レベル ASI が指定されています) の場合、データ・ハンドラーは以下の処理ステップに従います。
複数カーディナリティー型を処理する際のロジックは、単一カーディナリティー型を処理するロジックと同じです。具体的には、それぞれの <item> タグは複数カーディナリティー・オブジェクトにおける各ビジネス・オブジェクト・インスタンスに対応し、ASI を使用して処理されます。例えば、この複数カーディナリティー・ビジネス・オブジェクト定義構造に、対応する ASI があるとします。
データ・ハンドラーに送られたイベントに、この複数カーディナリティー・オブジェクトのインスタンスが 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 プロパティーは、SOAP でエンコードされた単純タイプ配列の場合にのみ使用してください。例えば、次のような直列化があるとします。
<CustomerNames SOAP-ENC:arrayType="xsd:string[4]" xmlns:SOAP-ENC= "http://schemas.xmlsoap.org/soap/encoding/" xsi:type="SOAP-ENC:Array"> <item xsi:type="xsd:string">value1</item> <item xsi:type="xsd:string">value2</item> <item xsi:type="xsd:string">value3</item> <item xsi:type="xsd:string">value4</item> </CustomerNames>
これは、図 48 に示すようなビジネス・オブジェクト定義を必要とします。
(わかりやすいように、ビジネス・オブジェクトは要求レベルから示します。)
また、arrayof プロパティーを使用して、item 以外の名前の配列項目を作成できます。前述の例を使用する際、ビジネス・オブジェクト属性名および「arrayof」 ASI プロパティー値の両方が name である場合は、<item> タグを <name> タグに置き換えることができます。この場合、直列化は次のようになります。
<CustomerNames SOAP-ENC:arrayType="xsd:string[4]" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="SOAP-ENC:Array"> <name xsi:type="xsd:string">value1</name> <name xsi:type="xsd:string">value2</name> <name xsi:type="xsd:string">value3</name> <name xsi:type="xsd:string">value4</name> </CustomerNames>
作成される SOAP 属性に対応したネーム・スペースを指定することをお勧めします。そのためには、単純型の場合には ASI プロパティー attr_ns を指定します。データ・ハンドラーが attr_ns プロパティーを処理するのは、同じ属性の ASI に attr_name が存在する場合のみです。attr_name および attr_ns には、以下の規則が適用されます。
<CustInfo Street="577 Airport"></CustomerInfo>
<CustInfo ns2:Street="577 Airport" xmlns:ns2= "AttrNS"></CustomerInfo>
SOAP データ・ハンドラーを使用して別のデータ・ハンドラーを呼び出し、ビジネス・オブジェクトを、対応するデータ・ハンドラーが存在する任意の形式に書き出すことができます。これは、SOAP 子ビジネス・オブジェクトを SOAP ストリングに変換 するときに、エンコードされたテキストを SOAP メッセージに追加することによって行います。
SOAP 要素の値をエンコードすることのできるフォーマットの 1 つに、RNIF 文書があります。この機能を使用するためには、任意のレベルの SOAP 子ビジネス・オブジェクト に RNIF BO を追加してください。この RNIF ビジネス・オブジェクトをストリングに変換するときに別のデータ・ハンドラー を呼び出すように SOAP データ・ハンドラーに通知するためには、その属性の ASI に dh_mimetype プロパティーを追加します。ASI プロパティー dh_mimetype の値は、MO_DataHandler_Default メタオブジェクト で指定された適格な mimeType でなければなりません。この mimeType は、ビジネス・オブジェクトを処理するために 呼び出すデータ・ハンドラーを判別するために使用されます。
図 49 に示す SOAP 子ビジネス・オブジェクトでは、CustomerInfo は複合子であり、RNET_Pip3A2PriceAndAvailabilityQuery は 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 および type_ns を xsd:base64Binary に解決されるように 設定すると、SOAP データ・ハンドラーは、対応する要素の値を設定する前に、ビジネス・オブジェクトから得られた値をエンコードします。データ・ハンドラーは Apache API を使用してレジストリーに対して base64Binary シリアライザー の照会を行い、呼び出し先データ・ハンドラーから戻されたストリングをシリアライズし、要素の値を設定します。
以下のセクションでは、スキーマ complexType の標識がビジネス・オブジェクトに 与える影響について説明します。標識には以下のものがあります。
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 ビジネス・オブジェクトは、図 50 のようなものとなります。
図 50 に示したビジネス・オブジェクトに 対応する 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>
<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 が含められます。
図 51 は、これに対応する SOAP ビジネス・オブジェクトを示しています。
図 51 に示したビジネス・オブジェクトに 対応する 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 標識は、デフォルトでは、この 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 番目に 表示することも、逆の順序で表示することもできます。
図 52 は、このスキーマに対応する ビジネス・オブジェクトを表しています。
対応する SOAP メッセージは次のようになります。
<Item xsi:type="ns0:Item"> <quantity xsi:type="xsd:string">12</quantity> <product xsi:type="xsd:string">2</product> </Item>
このセクションで説明するように、SOAP データ・ハンドラーは、「all」コンテント・モデルを持つ複合タイプ配列コンテントを処理します。例では、ArrayOfSOAPStruct が、「all」コンテント・モデルを持つ SOAPStruct を含んでいます。
<complexType name="SOAPStruct"> <all> <element name="varString" type="string" /> <element name="varInt" type="int" /> <element name="varFloat" type="float" /> </all> </complexType> <complexType name ="ArrayOfSOAPStruct'"> <complexContent> <restriction base='SOAP-ENC:Array'> <attribute ref='SOAP-ENC:arrayType' wsdl:arrayType='typens:SOAPStruct[]'/> </restriction> </complexContent> </complexType>
SOAP データ・ハンドラーは、直列化時に次の SOAP データを生成しなければなりません。
<?xml version='1.0' encoding='UTF-8'?> <SOAP-ENV:Envelope xmlns:SOAP-ENV = "http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <SOAP-ENV:Body> <ns0:echoStructArray xmlns:ns0="http://soapinterop.org/"> <inputStructArray SOAP-ENC:arrayType="ns1:SOAPStruct[2]" xmlns:ns1="http://soapinterop.org/xsd" xsi:type="SOAP-ENC:Array"> <item> <ns1:varFloat xsi:type="xsd:string">1.1</ns1:varFloat> <ns1:varInt xsi:type="xsd:string">1</ns1:varInt> <ns1:varString xsi:type="xsd:string">hi</ns1:varString> <item> <item> <ns1:varString xsi:type="xsd:string">hello</ns1:varString> <ns1:varInt xsi:type="xsd:string">1</ns1:varInt> <ns1:varFloat xsi:type="xsd:string">1.1</ns1:varFloat> </item> </inputStructArray> </ns0:echoStructArray> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
この例において、echoStructArray は操作の名前であり、inputStructArray はタイプ ArrayOfSOAPStruct を持つパラメーター名です。
sequence 標識は、子要素が、complexType で指定されたとおりの順序で 現れなければならないことを示します。
<complexType name="Item"> <sequence> <element name="quantity" type="int"/> <element name="product" type="string"/> </sequence> </complexType>
SOAP データ・ハンドラーは、この標識のための特別な ASI または ラッパー・オブジェクトを必要としません。デフォルトでは、データ・ハンドラーは、ビジネス・オブジェクトで指定されたとおりの 順序で SOAP 要素の読み取りおよび書き込みを行います。
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 メッセージをビジネス・オブジェクトに変換するときには、データ・ハンドラーは既存の要素を読み取り、それに対応する属性を取り込みます。
モデル・グループ (sequence、choice、group、および all) は、minOccurs 属性と maxOccurs 属性を持っています。minOccurs および maxOccurs のデフォルト値は 1 です。all グループの場合、maxOccurs は値 1 のみを取ることができます。WSDL ODA および SOAP データ・ハンドラーは、sequence、choice、および group に対するすべての指定可能な maxOccurs の値をサポートします。
SOAP データ・ハンドラーは、着信 SOAP メッセージを読み取って 検証するために、ビジネス・オブジェクトの ASI を使用します。SOAP データ・ハンドラーによる ASI の検証には、以下の規則が適用されます。
単純、カーディナリティー 1、およびカーディナリティー n の属性の検証には、以下の規則が適用されます。
単純、カーディナリティー 1、およびカーディナリティー n の属性の検証には、以下のケースが当てはまります。
以下のセクションでは、type_name および type_ns の検証について説明します。
xsdType が true の場合、type_name および type_ns の検証には以下の規則が適用されます。
xsdType が false の場合、type_name および type_ns の検証には以下の規則が適用されます。
xsdType が true の場合、type_name および type_ns の検証には以下の規則が適用されます。
xsdType が false の場合、type_name および type_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>
ここで、図 53 に示すビジネス・オブジェクト定義構造について考えてみます (各属性の右に属性レベル ASI が指定されています)。
データ・ハンドラーは以下の処理ステップに従います。
データ・ハンドラーは、所定の要素の 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 ビジネス・オブジェクトは、図 54 のようなものとなります。
RNIFExample 要素には、その要素値として RNIF エンコード・ストリングが含まれています。また、ASI プロパティー elem_name、elem_ns、type_name、type_ns、および xsdtype は、このビジネス・オブジェクト属性との関係を依然として維持しています。
SOAP からビジネス・オブジェクトへの変換では、SOAP データ・ハンドラーと Web サービス・コネクターは、情報を交換してビジネス・オブジェクト名を解決する特殊な契約に準拠しています。このコネクターは、SOAP データ・ハンドラーに、BodyName と BodyNamespace のペアにマップされるビジネス・オブジェクト名のリストを提供します。さらに、TLO に defaultfault ビジネス・オブジェクトが設定されている場合は、この情報がデータ・ハンドラーに渡されます。この情報が渡されると、SOAP データ・ハンドラーは、以下のステップに従って処理します。