En esta sección se muestra cómo migrar o manejar esquemas XML que tienen tipos de matriz codificados para SOAP.
Habrá casos en los que una aplicación SCA deba invocar un servicio externo que utilice el tipo soapend:Array. No hay forma de evitar esto en algunos casos, así que esta es la manera de manejar esta situación:
<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>
// Localizar el servicio de proveedor (vendor) y buscar la operación doFindVendor Service findVendor=(Service)ServiceManager.INSTANCE.locateService("vendorSearch"); OperationType doFindVendorOperationType=findVendor.getReference().getOperationType("doGoogleSearch"); // Crear el DataObject de entrada DataObject doFindVendor=DataFactory.INSTANCE.create(doFindVendorOperationType.getInputType()); doFindVendor.setString("productId", “12345”); doFindVendor.setString("productName", “Refrigerator”); // Invocar el servicio FindVendor DataObject FindVendorResult = (DataObject)findVendor.invoke(doFindVendorOperationType, doFindVendor); // Visualizar el resultado 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
A continuación se proporciona otro ejemplo en el que el tipo root del objeto de datos es soapenc:Array. Observe cómo se crea el DataObject sampleElements utilizando el segundo esquema listado anteriormente. Primero se obtiene el tipo del DataObject y, a continuación, la propiedad de sampleStructElement. En realidad se trata de una propiedad de sustitución y solo se utiliza para obtener una propiedad válida para utilizarla al añadir los DataObjects a la secuencia. En su caso puede utilizarse un patrón como este:
<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>
// Crear el DataObject de entrada y obtener la secuencia SDO para el elemento // any DataFactory dataFactory=DataFactory.INSTANCE; DataObject arrayOfStruct = dataFactory.create("http://soapinterop.org/xsd","ArrayOfSOAPStruct"); Sequence sequence=arrayOfStruct.getSequence("any"); // Obtener la propiedad SDO para el elemento sample que deseamos utilizar // aquí para llenar la secuencia // Hemos definido este elemento en un archivo XSD, consulte SampleElements.xsd DataObject sampleElements=dataFactory.create("http://sample/elements", "DocumentRoot"); Property property = sampleElements.getType().getProperty("sampleStructElement"); // Añadir los elementos a la secuencia 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); // Invocar la operación echoStructArray System.out.println("[client] invoking echoStructArray operation"); DataObject echoArrayOfStruct = (DataObject)interopTest.invoke("echoStructArray", arrayOfStruct); // Visualizar el resultado 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"));