Dieser Abschnitt beschreibt die Migration oder Handhabung von Schemas, die über SOAP-verschlüsselte Feldgruppentypen verfügen.
Es wird Fälle geben, in denen eine SCA-Anwendung einen externen Service aufrufen muss, der den Typ soapend:Array verwendet. Dies kann in einigen Fällen nicht vermieden werden, daher wird im Folgenden beschrieben, wie Sie diese Situation handhaben können:
<xsd:complexType name="Vendor"> <xsd:all> <xsd:element name="name" type="xsd:string" /> <xsd:element name="phoneNumber" type="xsd:string" /> </xsd:all> </xsd:complexType> </xsd:schema> <xsd:complexType name="Vendors"> <xsd:complexContent mixed="false"> <xsd:restriction base="soapenc:Array"> <xsd:attribute wsdl:arrayType="tns:Vendor[]" ref="soapenc:arrayType" xmlnxsd:wsdl="http://schemas.xmlsoap.org/wsdl/" /> </xsd:restriction> </xsd:complexContent> <xsd:complexType name="VendorsForProduct"> <xsd:all> <xsd:element name="productId" type="xsd:string" /> <xsd:element name="vendorList" type="tns:Vendors" /> </xsd:all> </xsd:complexType> <xsd:complexType name="Product"> <xsd:all> <xsd:element name="productId" type="xsd:string" /> <xsd:element name="productName" type="xsd:string" /> </xsd:all> </xsd:complexType> <message name="doFindVendorResponse"> <part name="returnVal" type="tns:VendorsForProduct" /> </message> <operation name="doFindVendor"> <input message="tns:doFindVendor" /> <output message="tns:doFindVendorResponse" /> </operation>
// Locate the vendor service and find the doFindVendor operation Service findVendor=(Service)ServiceManager.INSTANCE.locateService("vendorSearch"); OperationType doFindVendorOperationType=findVendor.getReference().getOperationType("doGoogleSearch"); // Create the input DataObject DataObject doFindVendor=DataFactory.INSTANCE.create(doFindVendorOperationType.getInputType()); doFindVendor.setString("productId", “12345”); doFindVendor.setString("productName", “Refrigerator”); // Invoke the FindVendor service DataObject FindVendorResult = (DataObject)findVendor.invoke(doFindVendorOperationType, doFindVendor); // Display the results int resultProductId=findVendorResult.getString("productId"); DataObject resultElements=findVendorResult.getDataObject("vendorList"); Sequence results=resultElements.getSequence(0); for (int i=0, n=results.size(); i for (int i=0, n=results.size(); i
Im Folgenden finden Sie ein weiteres Beispiel, in dem es sich beim Roottyp um ein soapenc:Array handelt. Achten Sie darauf, wie das sampleElements DataObject mit dem zweiten oben aufgelisteten Schema erstellt wird. Zunächst wird der Typ des DataObject ermittelt und anschließend die Eigenschaft für sampleStructElement. Hierbei handelt es sich in Wirklichkeit um eine Platzhaltereigenschaft und diese wird nur verwendet, um eine gültige Eigenschaft beim Hinzufügen der DataObjects zur Sequenz zu erhalten. In Ihrem Szenario kann das folgende Muster verwendet werden:
<s:schema elementFormDefault="qualified" targetNamespace="http://soapinterop.org/xsd"> <s:import namespace="http://schemas.xmlsoap.org/soap/encoding/" /> <s:import namespace="http://schemas.xmlsoap.org/wsdl/" /> <s:complexType name="SOAPStruct"> <s:sequence> <s:element minOccurs="1" maxOccurs="1" form="unqualified" name="varInt" type="s:int" /> <s:element minOccurs="1" maxOccurs="1" form="unqualified" name="varString" type="s:string" /> <s:element minOccurs="1" maxOccurs="1" form="unqualified" name="varFloat" type="s:float" /> </s:sequence> </s:complexType> <s:complexType name="ArrayOfSOAPStruct"> <s:complexContent mixed="false"> <s:restriction base="soapenc:Array"> <s:attribute wsdl:arrayType="s0:SOAPStruct[]" ref="soapenc:arrayType" /> </s:restriction> </s:complexContent> </s:complexType> </s:schema> <wsdl:message name="echoStructArraySoapIn"> <wsdl:part name="inputStructArray" type="s0:ArrayOfSOAPStruct" /> </wsdl:message> <wsdl:message name="echoStructArraySoapOut"> <wsdl:part name="return" type="s0:ArrayOfSOAPStruct" /> </wsdl:message> <wsdl:operation name="echoStructArray"> <wsdl:input message="tns:echoStructArraySoapIn" /> <wsdl:output message="tns:echoStructArraySoapOut" /> </wsdl:operation> <schema targetNamespace="http://sample/elements" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://sample/elements"> <element name="sampleStringElement" type="string"/> <element name="sampleStructElement" type="any"/> </schema>
// Create the input DataObject and get the SDO sequence for the any // element DataFactory dataFactory=DataFactory.INSTANCE; DataObject arrayOfStruct = dataFactory.create("http://soapinterop.org/xsd","ArrayOfSOAPStruct"); Sequence sequence=arrayOfStruct.getSequence("any"); // Get the SDO property for the sample element that we want to use // here to populate the sequence // We have defined this element in an XSD file, see SampleElements.xsd DataObject sampleElements=dataFactory.create("http://sample/elements", "DocumentRoot"); Property property = sampleElements.getType().getProperty("sampleStructElement"); // Add the elements to the sequence DataObject item=dataFactory.create("http://soapinterop.org/xsd", "SOAPStruct"); item.setInt("varInt", 1); item.setString("varString", "Hello"); item.setFloat("varFloat", 1.0f); sequence.add(property, item); item=dataFactory.create("http://soapinterop.org/xsd", "SOAPStruct"); item.setInt("varInt", 2); item.setString("varString", "World"); item.setFloat("varFloat", 2.0f); sequence.add(property, item); // Invoke the echoStructArray operation System.out.println("[client] invoking echoStructArray operation"); DataObject echoArrayOfStruct = (DataObject)interopTest.invoke("echoStructArray", arrayOfStruct); // Display the results if (echoArrayOfStruct!=null) { sequence=echoArrayOfStruct.getSequence("any"); for (int i=0, n=sequence.size(); i<n; i++) { item=(DataObject)sequence.getValue(i); System.out.println("[client] item varInt = "+ item.getInt("varInt")+" varString="+item.getString("varString")+" varFloat="+item.getFloat("varFloat"));