Esta seção mostra como migrar ou manipular esquemas XML que têm tipos de matrizes codificadas pelo SOAP.
Há casos em que um aplicativo SCA deve chamar um serviço externo que não utiliza o tipo soapend:Array. Em alguns casos, não existe uma maneira de evitar isto, portanto, a seguir é mostrado como lidar com esta situação:
<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>
// Localize o serviço do fornecedor e a operação doFindVendor Service findVendor=(Service)ServiceManager.INSTANCE.locateService("vendorSearch"); OperationType doFindVendorOperationType=findVendor.getReference().getOperationType("doGoogleSearch"); // Crie o DataObject de entrada DataObject doFindVendor=DataFactory.INSTANCE.create(doFindVendorOperationType.getInputType()); doFindVendor.setString("productId", “12345”); doFindVendor.setString("productName", “Refrigerator”); // Chame o serviço FindVendor DataObject FindVendorResult = (DataObject)findVendor.invoke(doFindVendorOperationType, doFindVendor); // Exiba os resultados 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
Aqui há outro exemplo em que o tipo de raiz do objeto de dados é um soapenc:Array. Observe como o sampleElements DataObject é criado utilizando o segundo esquema listado acima. O tipo do DataObject é obtido primeiro e, em seguida, é obtida a propriedade para sampleStructElement. Isso é realmente uma propriedade do sinalizador de substituição e é utilizada apenas para obter uma propriedade válida a ser utilizada ao incluir o DataObjects na seqüência. Um padrão como esse pode ser utilizado em seu cenário:
<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>
// Crie o DataObject de entrada e obtenha a seqüência de SDO para qualquer // elemento DataFactory dataFactory=DataFactory.INSTANCE; DataObject arrayOfStruct = dataFactory.create("http://soapinterop.org/xsd","ArrayOfSOAPStruct"); Sequence sequence=arrayOfStruct.getSequence("any"); // Obtenha a propriedade de SDO para o elemento de amostra que desejamos utilizar // aqui para ocupar a seqüência // Definimos este elemento em um arquivo XSD, consulte SampleElements.xsd DataObject sampleElements=dataFactory.create("http://sample/elements", "DocumentRoot"); Property property = sampleElements.getType().getProperty("sampleStructElement"); // Inclua os elementos na seqüência 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); // Chame a operação echoStructArray System.out.println("[client] invoking echoStructArray operation"); DataObject echoArrayOfStruct = (DataObject)interopTest.invoke("echoStructArray", arrayOfStruct); // Exiba os resultados 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"));