You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-user@axis.apache.org by Artur Kraft <kr...@darkfluid.com> on 2006/05/30 15:32:35 UTC

[Axis v1.4] typeMapping or client-side class generation problem

Hello,

I encountered a problem with the client of my axis web service, but I 
could also be a problem on the server side. A "Date[]" array is beeing 
transferred and the browser shows the fields correctly (as long as I can 
tell), but the client receives only one element instead of five. 
Something with the WSDL typeMapping or the axis client generation is 
malfunctioning, I would suggest.

Three questions arise:
1) Why don't get all Dates from the SOAP xsd:dateTime elements 
transferred into the date array on client-side?
2) Why is so much manual customization required?
3) Am I doing something wrong in my development process?


In the following I provide the necessary information related to this issue:
The service has a "History" class as part of the Interface(History class 
shown below), which has a "java.util.Date[]" field called 
"allCalibrations".

*class History (web service):*
import java.util.Date;
public class History {
    public Date lastCalibration      = null;
    public Date nextCalibration     = null;
    public Date[] allCalibrations    = null;
    ...
}


If the client sends its request, the response in the browser looks fine 
(SOAP Message shown below), it shows the five dates from the 
allCalibrations Date[] field.

*SOAP Response of the web service request **"getHistory" ** (browser):*
<?xml version="1.0" encoding="UTF-8"?>
  <soapenv:Envelope 
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soapenv:Body>
      <getHistoryResponse xmlns="">
        <ns1:getHistoryReturn 
xmlns:ns1="http://mdmonitor.webservice.qsgrimm.de">
          <ns1:lastCalibration 
xsi:type="xsd:date">2002-09-11</ns1:lastCalibration>
          <ns1:nextCalibration 
xsi:type="xsd:date">2002-09-11</ns1:nextCalibration>
          <ns1:allCalibrations 
xsi:type="xsd:date">1996-08-03</ns1:allCalibrations>
          <ns1:allCalibrations 
xsi:type="xsd:date">1997-09-16</ns1:allCalibrations>
          <ns1:allCalibrations 
xsi:type="xsd:date">1999-11-02</ns1:allCalibrations>
          <ns1:allCalibrations 
xsi:type="xsd:date">2001-02-09</ns1:allCalibrations>
          <ns1:allCalibrations 
xsi:type="xsd:date">2002-09-11</ns1:allCalibrations>
          ...
        </ns1:getHistoryReturn>
      </getHistoryResponse>
    </soapenv:Body>
  </soapenv:Envelope>


*The web service WSDL, "History" complex type:*
<complexType name="History">
  <sequence>
    <element name="lastCalibration" nillable="true" type="xsd:dateTime"/>
    <element name="nextCalibration" nillable="true" type="xsd:dateTime"/>
    <element name="allCalibrations" nillable="true" 
type="impl:ArrayOf_xsd_dateTime"/>
    ...
  </sequence>
</complexType>


The cause of the client only receiving a one field Date object in the 
allCalibrations field could be due to "deploy.wsdd"-file manipulations. 
Generating a wsdl file from the web service interface results in many 
typeMappings like the following. But a 
"de.qsgrimm.webservice.mdmonitor.GetJobs" class doesn't exist, so I 
removed all those entries.

*TypeMapping, automatically generated by axis:*
<typeMapping
        xmlns:ns="http://mdmonitor.webservice.qsgrimm.de"
        qname="ns:>getJobs"
        type="java:de.qsgrimm.webservice.mdmonitor.GetJobs"
        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
        encodingStyle=""
/>

One entry was due to the Date array in the History class. The Mapping 
was the following:
*ArrayTypeMapping, automatically generated by axis:*
<arrayMapping
        xmlns:ns="http://mdmonitor.webservice.qsgrimm.de"
        qname="ns:ArrayOf_xsd_dateTime"
        type="java:java.util.Calendar[]"
        innerType="cmp-ns:dateTime" 
xmlns:cmp-ns="http://www.w3.org/2001/XMLSchema"
        encodingStyle=""
/>

But leaving the above statement in the deploy.wsdd, the field 
allCalibrations(Date[]) maps on client-side to:
/private java.lang.Object[] allCalibrations;/

Removing also the dateTime array mapping, results in a correct 
client-side-mapping as:
/private java.util.Calendar[] allCalibrations;/

but this configuration of History results in an exception thrown:/
- Could not convert java.util.Date to bean field 'allCalibrations', type 
[Ljava.util.Calendar;
- Exception:
java.lang.IllegalArgumentException: argument type mismatch
    at 
org.apache.axis.encoding.ser.BeanPropertyTarget.set(BeanPropertyTarget.java:157)
   ...
/
So, I altered the History class on the client-side by hand to the 
following for the client to function properly. But it seems as only a 
(bad) workaround to me.
/private java.util.Date[] allCalibrations;/
while *lastCalibration* and *nextCalibration *last as:
/java.util.Calendar xCalibration/
...which seems to me quite weird, but functional.

Again the three questions:
1) Why don't get all Dates from the SOAP xsd:dateTime elements 
transferred into the date array on client-side?
2) Why is so much manual customization required?
3) Am I doing something wrong in my development process?



Thanks a lot for your help!
kind regards
Artur Kraft