Migration d'interfaces WSDL avec des types de tableau encodé soap

Cette section décrit comment migrer ou gérer des schémas XML avec des types de tableau encodé soap.

Les types de tableau encodé soap et dotés du style RPC sont traités par la version 6.0 comme des séquences illimitées d'un type concret. Il n'est pas recommandé de créer des types XSD qui référencent les types soapend:Array, car le modèle de programmation se déplace vers le style encapsulé Document/Literal plutôt que vers le style RPC.

Dans certains cas, une application SCA doit appeler un service externe qui utilise le type soapend:Array. Il arrive que cette situation ne puisse pas être évitée. Voici comment vous pouvez la gérer :

Exemple de code WSDL :
		<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>
Exemple de code pour un client de ce service Web :
  // Trouver le service du
fournisseur et rechercher l'opération doFindVendor

Service findVendor=(Service)ServiceManager.INSTANCE.locateService("vendorSearch");
            OperationType doFindVendorOperationType=findVendor.getReference().
            getOperationType("doGoogleSearch");
            
            // Créer l'objet DataObject utilisé en entrée
            DataObject doFindVendor=DataFactory.INSTANCE.create(doFindVendorOperationType.getInputType());
            doFindVendor.setString("productId", “12345”);
            doFindVendor.setString("productName", “Refrigerator”);

            // Appeler le service FindVendor
			DataObject FindVendorResult = (DataObject)findVendor.invoke(doFindVendorOperationType, doFindVendor);
            
            // Afficher les résultats
            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

Voici un autre exemple dans lequel le type racine de l'objet de données est soapenc:Array. Remarquez la façon dont l'objet de données sampleElements est créé à l'aide du second schéma listé ci-dessus. Le type de l'objet de données est obtenu en premier, avant la propriété de sampleStructElement. Il s'agit véritablement d'une propriété de signet qui est uniquement utilisée pour obtenir une propriété valide permettant d'ajouter les DataObjects à la séquence. Le modèle suivant peut être utilisé dans votre scénario :

Exemple de code WSDL :
<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>
Exemple de code pour un client de ce service Web :
// Créer l'objet DataObject utilisé en entrée
// et obtenir la séquence SDO pour l'élément any
DataFactory dataFactory=DataFactory.INSTANCE;
DataObject arrayOfStruct =
dataFactory.create("http://soapinterop.org/xsd","ArrayOfSOAPStruct");
Sequence sequence=arrayOfStruct.getSequence("any");
            
// Obtenir la propriété SDO pour l'élément exemple à utiliser
// dans ce cas pour renseigner la séquence.
// Cet élément a été défini dans le fichier SampleElements.xsd.
DataObject
sampleElements=dataFactory.create("http://sample/elements",
"DocumentRoot");
Property property =
sampleElements.getType().getProperty("sampleStructElement");
            
            // Ajouter les éléments à la séquence
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);

// Appeler l'opération echoStructArray
System.out.println("[client] invoking echoStructArray operation");
DataObject echoArrayOfStruct = (DataObject)interopTest.invoke("echoStructArray", arrayOfStruct);
            
// Afficher les résultats
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"));

Commentaires
(C) Copyright IBM Corporation 2005. Tous droits réservés.