axis-java-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Simon McMahon" <>
Subject Re: [1.3] Handling arrays - interop with .NET
Date Wed, 28 Jun 2006 23:45:57 GMT
Hi Anne,
The WSDL is just cut and paste off my Apache/Tomcat server that hosts
the WS. You can see the complete WSDL at:
See def below. This was originally generated by Axis but
I have added fields to it since then. There is no field in my definition
for the extra field tagged onto each structure. There are 3 structures
that get this extra field at the end and they are all the ones that get
returned as arrays from my services.
This is one of the service entry points:
 public Provider[] getProviders(String name, String providerNo, String
          String locationId, int maxResults)
  throws Exception

The others are all constructed similarly.
> Can you convert to doc/literal?
How do I do this?
> Add this parameter (dotNetSoapEncFix) to your global configuration: 
I am trying this now.
import javax.xml.namespace.QName;
import org.apache.axis.description.ElementDesc;
public class Provider
 protected int id;
 protected String name;
 protected String providerId;
 protected String org;
 protected String locationId;
 protected String application;
 protected String deliveryMethod;
 public Provider()
 public void setProvider(String name, String providerNo, String org,
      String locationId, String application, String deliveryMethod)
 { = name;
  this.providerId = providerNo; = org;
  this.locationId = locationId;
  this.application = application;
  this.deliveryMethod = deliveryMethod;
 public void setProvider(Provider pd)
  setId(pd.getId()); = pd.getName();
  this.providerId = pd.getProviderId(); = pd.getOrg();
  this.locationId = pd.getLocationId();
  this.application = pd.getApplication();
  this.deliveryMethod = pd.getDeliveryMethod();
 public int getId() {return id;}
 public void setId(int id) { = id;}
 public String getName() {return name;}
 public void setName(String name){ = name;}
 public String getLocationId(){return this.locationId;}
 public void setlocationId(String locationId){this.locationId =
 public String getOrg(){return org;}
 public void setOrg(String org){ = org;}
 public String getProviderId(){return providerId;}
 public void setProviderId(String providerNo){this.providerId =
 public String getApplication() {return application;}
 public void setApplication(String application) {this.application =
 public String getDeliveryMethod() {return deliveryMethod;}
 public void setDeliveryMethod(String deliveryMethod)
{this.deliveryMethod = deliveryMethod;}
 public String toString()
  String s = "";
  if ( name != null && !name.equals(""))
   s += "name=\"" + name + "\"";
     if ( providerId != null && !providerId.equals(""))
         s += ", providerNo=\"" + providerId + "\"";
     if ( org != null && !org.equals(""))
         s += ", org=\"" + org + "\"";
     if ( locationId != null && !locationId.equals(""))
         s += ", locationId=\"" + locationId + "\"";
     if ( application != null && !application.equals(""))
         s += ", application=\"" + application + "\"";
     if ( deliveryMethod != null && !deliveryMethod.equals(""))
         s += ", deliveryMethod=\"" + deliveryMethod + "\"";
  return s;
 public synchronized boolean equals(Object obj)
  if (!(obj instanceof Provider))
   return false;
  Provider other = (Provider)obj;
  if (obj == null)
   return false;
  if (this == obj)
   return true;
  if (__equalsCalc != null) {
   return (__equalsCalc == obj);
  __equalsCalc = obj;
  boolean _equals;
  _equals =
   true && (( == null && other.getName() == null) ||
                ( != null && &&
   ((this.providerId == null && other.getProviderId() == null) ||
                (this.providerId != null &&
this.providerId.equals(other.getProviderId()))) &&
   (( == null && other.getOrg() == null) ||
                ( != null &&
   ((this.application == null && other.getApplication() == null) ||
                (this.application != null &&
this.application.equals(other.getApplication()))) &&
            ((this.deliveryMethod == null && other.getDeliveryMethod()
== null) ||
                (this.deliveryMethod != null &&
this.deliveryMethod.equals(other.getDeliveryMethod()))) &&
   ((this.locationId == null && other.getLocationId() == null) ||
                (this.locationId != null &&
  __equalsCalc = null;
  return _equals;
 public synchronized int hashCode()
  if (__hashCodeCalc) {
   return 0;
  __hashCodeCalc = true;
     String h;
  int _hashCode = 1;
     h = getName();
     if (h != null) { _hashCode += h.hashCode(); }
     h = getProviderId();
     if (h != null) { _hashCode += h.hashCode(); }
     h = getOrg();
     if (h != null) { _hashCode += h.hashCode(); }
     h = getLocationId();
     if (h != null) { _hashCode += h.hashCode(); }
     h = getApplication();
     if (h != null) { _hashCode += h.hashCode(); }
     h = getDeliveryMethod();
     if (h != null) { _hashCode += h.hashCode(); }
  __hashCodeCalc = false;
  return _hashCode;
 protected Object __equalsCalc = null;
 protected boolean __hashCodeCalc = false;
 private static org.apache.axis.description.TypeDesc typeDesc =
  new org.apache.axis.description.TypeDesc(Provider.class, true);
 static {
  typeDesc.setXmlType(new javax.xml.namespace.QName("urn:qh",
 private static void initStringField(String name)
  ElementDesc elemField;
  elemField = new ElementDesc();
  elemField.setXmlName(new QName("", name));
QName("", "string"));
  * Return type metadata object
 public static org.apache.axis.description.TypeDesc getTypeDesc()
 return typeDesc;
  * Get Custom Serializer
 public static org.apache.axis.encoding.Serializer
getSerializer(java.lang.String mechType,
         java.lang.Class _javaType, javax.xml.namespace.QName
 return new org.apache.axis.encoding.ser.BeanSerializer(_javaType,
_xmlType, typeDesc);
  * Get Custom Deserializer
 public static org.apache.axis.encoding.Deserializer
getDeserializer(java.lang.String mechType,
         java.lang.Class _javaType, javax.xml.namespace.QName
 return new org.apache.axis.encoding.ser.BeanDeserializer(_javaType,
_xmlType, typeDesc);


Simon McMahon
Work: (07) 31311420
Mobile: (043) 2294180

>>> 06/28/06 11:11pm >>>
SOAP Encoding arrays are not particularly interoperable. Can you
convert to doc/literal?
If not, then you at least need to use the .NET SOAP Enocding fix. Add
this parameter to your global configuration:

<parameter name="dotNetSoapEncFix" value="true"/>

This fix will change soapenc:string to xsd:string.

I also question whether the array is defined accurately. Is your
Provider object supposed to include another Provider object? Because
that's how it's defined now. (The "provider" element is defined as
type="impl"Provider", not as a link or reference.) 

How did you generate this WSDL?


On 6/28/06, Simon McMahon < > wrote:Hi,

My web service returns an array of "Provider" (see below). 
The WSDL (see below) defines "Provider" with all my data elements but
adds the extra one on the end 'provider'. This appears to be a link
field, maybe to support the array of these things. This extra field 
appears to mess up the consuming application (.NET).

I do the Axis side, not the .NET so I'm not sure what the .NET problem
is or how to do anything different on the Axis side. The .NET people
have asked me not to use this link field for the arrays. How can I do 

Any help would be appreciated.



- <wsdl:types>
- <schema
  <import namespace=" " />

- <complexType name="Provider">
- <sequence>
  <element name="name" nillable="true" type="soapenc:string" />

  <element name="providerId" nillable="true" type="soapenc:string" /> 

  <element name="org" nillable="true" type="soapenc:string" />

  <element name="locationId" nillable="true" type="soapenc:string" />

  <element name="application" nillable="true" type="soapenc:string" />

  <element name="deliveryMethod" nillable="true" type="soapenc:string"


  <element name="id" type="xsd:int" />

  <element name="provider" nillable="true" type="impl:Provider" />



- <complexType name="ArrayOfProvider">
- <complexContent>
- <restriction base="soapenc:Array">
  <attribute ref="soapenc:arrayType" wsdl:arrayType="impl:Provider[]" 




Simon McMahon

Work: (07) 31311420
Mobile: (043) 2294180

This email, including any attachments sent with it, is
confidential and for the sole use of the intended recipient(s).
This confidentiality is not waived or lost, if you receive it and 
you are not the intended recipient(s), or if it is transmitted/
received in error.

Any unauthorised use, alteration, disclosure, distribution or
review of this email is strictly prohibited.  The information 
contained in this email, including any attachment sent with
it, may be subject to a statutory duty of confidentiality if it
relates to health service matters.

If you are not the intended recipient(s), or if you have 
received this email in error, you are asked to immediately
notify the sender by telephone collect on Australia
+61 1800 198 175 or by return email.  You should also
delete this email, and any copies, from your computer 
system network and destroy any hard copies produced.

If not an intended recipient of this email, you must not copy,
distribute or take any action(s) that relies on it; any form of
disclosure, modification, distribution and/or publication of this 
email is also prohibited.

Although Queensland Health takes all reasonable steps to
ensure this email does not contain malicious software,
Queensland Health does not accept responsibility for the
consequences if any person's computer inadvertently suffers 
any disruption to services, loss of information, harm or is
infected with a virus, other malicious computer programme or
code that may occur as a consequence of receiving this

Unless stated otherwise, this email represents only the views 
of the sender and not the views of the Queensland Government.

To unsubscribe, e-mail: 
For additional commands, e-mail: 

View raw message