Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Java > Can't deserialize xsd:date attributes using Axis WSDL2Java classes

Reply
Thread Tools

Can't deserialize xsd:date attributes using Axis WSDL2Java classes

 
 
john
Guest
Posts: n/a
 
      09-29-2004
I am generating client classes from a WSDL with the Axis WSDL2Java
tool.
Many of the attributes of the complexType objects described in the
wsdl
are xsd:date attributes. I can call some of the methods successfully,
but
when I call a method that returns an object that has an attribute
which maps
to an xsd:date attribute from the wsdl, the client fails with a
deserialization
error. Here is a snippet from the wsdl:

<xsd:element name="base_currency_select_response">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="currency" minOccurs="0" maxOccurs="1">
<xsd:complexType>
<xsd:attribute name="currency" type="xsd:string"
use="required"/>
<xsd:attribute name="user_code" type="xsd:string"
use="required"/>
<xsd:attribute name="description" type="xsd:string"/>
<xsd:attribute name="exchange_rate" type="s0:ZZMoney"
use="required"/>
<xsd:attribute name="n_decimal_places" type="xsd:int"
use="required"/>
<xsd:attribute name="change_date" type="xsd:date"
use="required"/>
<xsd:attribute name="currency_symbol" type="xsd:string"/>
<xsd:attribute name="html_symbol" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>

I look at the xml being sent back to the client from the server, and
it looks
like:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
soap:encodingStyle="" >
<soap:Body xmlns="http://Sandlot/XmlWebServices/" >
<base_currency_select_response table_specification="currency" >
<currency currency="USD" user_code="ZZS" description="US Dollar"
exchange_rate="1.000000" n_decimal_places="2" change_date="1998-01-01"
currency_symbol="$" />
</base_currency_select_response>
</soap:Body>
</soap:Envelope>

Note the part: change_date="1998-01-01"

In the Axis-WSDL2Java-generated data file representing this object,
this change_date is represented as a java.util.Date:
private java.util.Date change_date; // attribute

This is what happens in the console when I call the web service
method:
There was 1 error:
1) test8SandlotSoapBaseCurrencySelect(Sandlot.XmlWebS ervices.SandlotWSTestCase)A
xisFault
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
faultSubcode:
faultString: java.lang.NumberFormatException: Invalid date/time
faultActor:
faultNode:
faultDetail:
{http://xml.apache.org/axis/}stackTrace:java.lang.NumberFormatException:
Invalid date/time
at org.apache.axis.encoding.ser.BeanDeserializer.onSt artElement(BeanDese
rializer.java:417)
at org.apache.axis.encoding.DeserializerImpl.startEle ment(DeserializerIm
pl.java:435)
at org.apache.axis.encoding.ser.BeanDeserializer.star tElement(BeanDeseri
alizer.java:165)
at org.apache.axis.encoding.DeserializationContextImp l.startElement(Dese
rializationContextImpl.java:1053)
at org.apache.axis.message.SAX2EventRecorder.replay(S AX2EventRecorder.ja
va:19

I am using java 1.4.2_03. I have tried generating and calling the
service with
Axis 1.1 and 1.2 beta - same problem both times.

Anybody know what I am doing wrong? Or is this just and Axis bug? Or
is this a bug in the web service server (I doubt that - the xml looks
good - but maybe..)? Any ideas or suggestions would be greatly
appreciated.

Thanks.
-John

Any ideas for fixing this would be greatly appreciated.
 
Reply With Quote
 
 
 
 
Ankur Bulsara
Guest
Posts: n/a
 
      09-29-2004
Based on the error (Invalid date/time), it could be that you're sending bad
date strings. I.e. the format of the xml you're sending is not what the
deserializer is expecting. What's interesting is that the AXIS
CalendarDeserializer was not in the stack trace.

You can see the CalendarDeserializer code and what it expects as input here:
http://www.koders.com/35195/fidB834B...B2511576A.aspx

You may want to play around with different date string formats, such as a
full GMT format. At worst, you could implement your own <xsd:complexType>
date object.

-Ankur

"john" <(E-Mail Removed)> wrote in message
news:(E-Mail Removed) om...
> I am generating client classes from a WSDL with the Axis WSDL2Java
> tool.
> Many of the attributes of the complexType objects described in the
> wsdl
> are xsd:date attributes. I can call some of the methods successfully,
> but
> when I call a method that returns an object that has an attribute
> which maps
> to an xsd:date attribute from the wsdl, the client fails with a
> deserialization
> error. Here is a snippet from the wsdl:
>
> <xsd:element name="base_currency_select_response">
> <xsd:complexType>
> <xsd:sequence>
> <xsd:element name="currency" minOccurs="0" maxOccurs="1">
> <xsd:complexType>
> <xsd:attribute name="currency" type="xsd:string"
> use="required"/>
> <xsd:attribute name="user_code" type="xsd:string"
> use="required"/>
> <xsd:attribute name="description" type="xsd:string"/>
> <xsd:attribute name="exchange_rate" type="s0:ZZMoney"
> use="required"/>
> <xsd:attribute name="n_decimal_places" type="xsd:int"
> use="required"/>
> <xsd:attribute name="change_date" type="xsd:date"
> use="required"/>
> <xsd:attribute name="currency_symbol" type="xsd:string"/>
> <xsd:attribute name="html_symbol" type="xsd:string"/>
> </xsd:complexType>
> </xsd:element>
> </xsd:sequence>
> </xsd:complexType>
> </xsd:element>
>
> I look at the xml being sent back to the client from the server, and
> it looks
> like:
>
> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
> soap:encodingStyle="" >
> <soap:Body xmlns="http://Sandlot/XmlWebServices/" >
> <base_currency_select_response table_specification="currency" >
> <currency currency="USD" user_code="ZZS" description="US Dollar"
> exchange_rate="1.000000" n_decimal_places="2" change_date="1998-01-01"
> currency_symbol="$" />
> </base_currency_select_response>
> </soap:Body>
> </soap:Envelope>
>
> Note the part: change_date="1998-01-01"
>
> In the Axis-WSDL2Java-generated data file representing this object,
> this change_date is represented as a java.util.Date:
> private java.util.Date change_date; // attribute
>
> This is what happens in the console when I call the web service
> method:
> There was 1 error:
> 1)

test8SandlotSoapBaseCurrencySelect(Sandlot.XmlWebS ervices.SandlotWSTestCase)
A
> xisFault
> faultCode:

{http://schemas.xmlsoap.org/soap/envelope/}Server.userException
> faultSubcode:
> faultString: java.lang.NumberFormatException: Invalid date/time
> faultActor:
> faultNode:
> faultDetail:
>

{http://xml.apache.org/axis/}stackTrace:java.lang.NumberFormatException:
> Invalid date/time
> at

org.apache.axis.encoding.ser.BeanDeserializer.onSt artElement(BeanDese
> rializer.java:417)
> at

org.apache.axis.encoding.DeserializerImpl.startEle ment(DeserializerIm
> pl.java:435)
> at

org.apache.axis.encoding.ser.BeanDeserializer.star tElement(BeanDeseri
> alizer.java:165)
> at

org.apache.axis.encoding.DeserializationContextImp l.startElement(Dese
> rializationContextImpl.java:1053)
> at

org.apache.axis.message.SAX2EventRecorder.replay(S AX2EventRecorder.ja
> va:19
>
> I am using java 1.4.2_03. I have tried generating and calling the
> service with
> Axis 1.1 and 1.2 beta - same problem both times.
>
> Anybody know what I am doing wrong? Or is this just and Axis bug? Or
> is this a bug in the web service server (I doubt that - the xml looks
> good - but maybe..)? Any ideas or suggestions would be greatly
> appreciated.
>
> Thanks.
> -John
>
> Any ideas for fixing this would be greatly appreciated.



 
Reply With Quote
 
 
 
 
john
Guest
Posts: n/a
 
      09-30-2004
Thank you for your advice. Unfortunately, I can't change the type of
the
attribute - I don't have control over the WSDL or the web service
provider.
I only have control over the client.

I certainly think you are right: the server is sending someting back
that
the deserializer is not expecting. The server is sending back:
change_date="1998-01-01"
But as I say, I can't change the WSDL or what the server is sending.
All
I can do is try to figure out some way of getting the WSDL2Java client
generator to create code that can deal with this. You kindly
suggested that
I play around with different date string formats - but isn't that a
server-side
thing? How can I play around with different date-string formats
client-side
with generated code? If there's a way you could show me, I'd really
appreciate knowing it.

Thanks again,
John

"Ankur Bulsara" <hotmail@N0_SPAM_gmail.com> wrote in message news:<(E-Mail Removed)>...
> Based on the error (Invalid date/time), it could be that you're sending bad
> date strings. I.e. the format of the xml you're sending is not what the
> deserializer is expecting. What's interesting is that the AXIS
> CalendarDeserializer was not in the stack trace.
>
> You can see the CalendarDeserializer code and what it expects as input here:
> http://www.koders.com/35195/fidB834B...B2511576A.aspx
>
> You may want to play around with different date string formats, such as a
> full GMT format. At worst, you could implement your own <xsd:complexType>
> date object.
>
> -Ankur
>
> "john" <(E-Mail Removed)> wrote in message
> news:(E-Mail Removed) om...
> > I am generating client classes from a WSDL with the Axis WSDL2Java
> > tool.
> > Many of the attributes of the complexType objects described in the
> > wsdl
> > are xsd:date attributes. I can call some of the methods successfully,
> > but
> > when I call a method that returns an object that has an attribute
> > which maps
> > to an xsd:date attribute from the wsdl, the client fails with a
> > deserialization
> > error. Here is a snippet from the wsdl:
> >
> > <xsd:element name="base_currency_select_response">
> > <xsd:complexType>
> > <xsd:sequence>
> > <xsd:element name="currency" minOccurs="0" maxOccurs="1">
> > <xsd:complexType>
> > <xsd:attribute name="currency" type="xsd:string"
> > use="required"/>
> > <xsd:attribute name="user_code" type="xsd:string"
> > use="required"/>
> > <xsd:attribute name="description" type="xsd:string"/>
> > <xsd:attribute name="exchange_rate" type="s0:ZZMoney"
> > use="required"/>
> > <xsd:attribute name="n_decimal_places" type="xsd:int"
> > use="required"/>
> > <xsd:attribute name="change_date" type="xsd:date"
> > use="required"/>
> > <xsd:attribute name="currency_symbol" type="xsd:string"/>
> > <xsd:attribute name="html_symbol" type="xsd:string"/>
> > </xsd:complexType>
> > </xsd:element>
> > </xsd:sequence>
> > </xsd:complexType>
> > </xsd:element>
> >
> > I look at the xml being sent back to the client from the server, and
> > it looks
> > like:
> >
> > <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
> > soap:encodingStyle="" >
> > <soap:Body xmlns="http://Sandlot/XmlWebServices/" >
> > <base_currency_select_response table_specification="currency" >
> > <currency currency="USD" user_code="ZZS" description="US Dollar"
> > exchange_rate="1.000000" n_decimal_places="2" change_date="1998-01-01"
> > currency_symbol="$" />
> > </base_currency_select_response>
> > </soap:Body>
> > </soap:Envelope>
> >
> > Note the part: change_date="1998-01-01"
> >
> > In the Axis-WSDL2Java-generated data file representing this object,
> > this change_date is represented as a java.util.Date:
> > private java.util.Date change_date; // attribute
> >
> > This is what happens in the console when I call the web service
> > method:
> > There was 1 error:
> > 1)

> test8SandlotSoapBaseCurrencySelect(Sandlot.XmlWebS ervices.SandlotWSTestCase)
> A
> > xisFault
> > faultCode:

> {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
> > faultSubcode:
> > faultString: java.lang.NumberFormatException: Invalid date/time
> > faultActor:
> > faultNode:
> > faultDetail:
> >

> {http://xml.apache.org/axis/}stackTrace:java.lang.NumberFormatException:
> > Invalid date/time
> > at

> org.apache.axis.encoding.ser.BeanDeserializer.onSt artElement(BeanDese
> > rializer.java:417)
> > at

> org.apache.axis.encoding.DeserializerImpl.startEle ment(DeserializerIm
> > pl.java:435)
> > at

> org.apache.axis.encoding.ser.BeanDeserializer.star tElement(BeanDeseri
> > alizer.java:165)
> > at

> org.apache.axis.encoding.DeserializationContextImp l.startElement(Dese
> > rializationContextImpl.java:1053)
> > at

> org.apache.axis.message.SAX2EventRecorder.replay(S AX2EventRecorder.ja
> > va:19
> >
> > I am using java 1.4.2_03. I have tried generating and calling the
> > service with
> > Axis 1.1 and 1.2 beta - same problem both times.
> >
> > Anybody know what I am doing wrong? Or is this just and Axis bug? Or
> > is this a bug in the web service server (I doubt that - the xml looks
> > good - but maybe..)? Any ideas or suggestions would be greatly
> > appreciated.
> >
> > Thanks.
> > -John
> >
> > Any ideas for fixing this would be greatly appreciated.

 
Reply With Quote
 
Ankur Bulsara
Guest
Posts: n/a
 
      09-30-2004
When the client gets back a SOAP message, you could transform the SOAP via
XSLT into something more edible for the code generated by wsdl2Java.

So, you would have something like:

Incoming SOAP -> XSLT -> Transformed SOAP -> wsdl2java -> Happy client

Here's some example code that performs XSLT transformations.
http://www.koders.com/java/fid78E5DA...transform+xslt

You would just need to define an XSL document that transforms the server bad
date into an acceptable date.

Hope this helps,
Ankur

"john" <(E-Mail Removed)> wrote in message
news:(E-Mail Removed) om...
> Thank you for your advice. Unfortunately, I can't change the type of
> the
> attribute - I don't have control over the WSDL or the web service
> provider.
> I only have control over the client.
>
> I certainly think you are right: the server is sending someting back
> that
> the deserializer is not expecting. The server is sending back:
> change_date="1998-01-01"
> But as I say, I can't change the WSDL or what the server is sending.
> All
> I can do is try to figure out some way of getting the WSDL2Java client
> generator to create code that can deal with this. You kindly
> suggested that
> I play around with different date string formats - but isn't that a
> server-side
> thing? How can I play around with different date-string formats
> client-side
> with generated code? If there's a way you could show me, I'd really
> appreciate knowing it.
>
> Thanks again,
> John
>
> "Ankur Bulsara" <hotmail@N0_SPAM_gmail.com> wrote in message

news:<(E-Mail Removed)>...
> > Based on the error (Invalid date/time), it could be that you're sending

bad
> > date strings. I.e. the format of the xml you're sending is not what the
> > deserializer is expecting. What's interesting is that the AXIS
> > CalendarDeserializer was not in the stack trace.
> >
> > You can see the CalendarDeserializer code and what it expects as input

here:
> >

http://www.koders.com/35195/fidB834B...B2511576A.aspx
> >
> > You may want to play around with different date string formats, such as

a
> > full GMT format. At worst, you could implement your own

<xsd:complexType>
> > date object.
> >
> > -Ankur
> >
> > "john" <(E-Mail Removed)> wrote in message
> > news:(E-Mail Removed) om...
> > > I am generating client classes from a WSDL with the Axis WSDL2Java
> > > tool.
> > > Many of the attributes of the complexType objects described in the
> > > wsdl
> > > are xsd:date attributes. I can call some of the methods successfully,
> > > but
> > > when I call a method that returns an object that has an attribute
> > > which maps
> > > to an xsd:date attribute from the wsdl, the client fails with a
> > > deserialization
> > > error. Here is a snippet from the wsdl:
> > >
> > > <xsd:element name="base_currency_select_response">
> > > <xsd:complexType>
> > > <xsd:sequence>
> > > <xsd:element name="currency" minOccurs="0" maxOccurs="1">
> > > <xsd:complexType>
> > > <xsd:attribute name="currency" type="xsd:string"
> > > use="required"/>
> > > <xsd:attribute name="user_code" type="xsd:string"
> > > use="required"/>
> > > <xsd:attribute name="description" type="xsd:string"/>
> > > <xsd:attribute name="exchange_rate" type="s0:ZZMoney"
> > > use="required"/>
> > > <xsd:attribute name="n_decimal_places" type="xsd:int"
> > > use="required"/>
> > > <xsd:attribute name="change_date" type="xsd:date"
> > > use="required"/>
> > > <xsd:attribute name="currency_symbol" type="xsd:string"/>
> > > <xsd:attribute name="html_symbol" type="xsd:string"/>
> > > </xsd:complexType>
> > > </xsd:element>
> > > </xsd:sequence>
> > > </xsd:complexType>
> > > </xsd:element>
> > >
> > > I look at the xml being sent back to the client from the server, and
> > > it looks
> > > like:
> > >
> > > <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
> > > soap:encodingStyle="" >
> > > <soap:Body xmlns="http://Sandlot/XmlWebServices/" >
> > > <base_currency_select_response table_specification="currency" >
> > > <currency currency="USD" user_code="ZZS" description="US Dollar"
> > > exchange_rate="1.000000" n_decimal_places="2" change_date="1998-01-01"
> > > currency_symbol="$" />
> > > </base_currency_select_response>
> > > </soap:Body>
> > > </soap:Envelope>
> > >
> > > Note the part: change_date="1998-01-01"
> > >
> > > In the Axis-WSDL2Java-generated data file representing this object,
> > > this change_date is represented as a java.util.Date:
> > > private java.util.Date change_date; // attribute
> > >
> > > This is what happens in the console when I call the web service
> > > method:
> > > There was 1 error:
> > > 1)

> >

test8SandlotSoapBaseCurrencySelect(Sandlot.XmlWebS ervices.SandlotWSTestCase)
> > A
> > > xisFault
> > > faultCode:

> > {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
> > > faultSubcode:
> > > faultString: java.lang.NumberFormatException: Invalid date/time
> > > faultActor:
> > > faultNode:
> > > faultDetail:
> > >

> >

{http://xml.apache.org/axis/}stackTrace:java.lang.NumberFormatException:
> > > Invalid date/time
> > > at

> > org.apache.axis.encoding.ser.BeanDeserializer.onSt artElement(BeanDese
> > > rializer.java:417)
> > > at

> > org.apache.axis.encoding.DeserializerImpl.startEle ment(DeserializerIm
> > > pl.java:435)
> > > at

> > org.apache.axis.encoding.ser.BeanDeserializer.star tElement(BeanDeseri
> > > alizer.java:165)
> > > at

> > org.apache.axis.encoding.DeserializationContextImp l.startElement(Dese
> > > rializationContextImpl.java:1053)
> > > at

> > org.apache.axis.message.SAX2EventRecorder.replay(S AX2EventRecorder.ja
> > > va:19
> > >
> > > I am using java 1.4.2_03. I have tried generating and calling the
> > > service with
> > > Axis 1.1 and 1.2 beta - same problem both times.
> > >
> > > Anybody know what I am doing wrong? Or is this just and Axis bug? Or
> > > is this a bug in the web service server (I doubt that - the xml looks
> > > good - but maybe..)? Any ideas or suggestions would be greatly
> > > appreciated.
> > >
> > > Thanks.
> > > -John
> > >
> > > Any ideas for fixing this would be greatly appreciated.



 
Reply With Quote
 
kgarg01 kgarg01 is offline
Junior Member
Join Date: Oct 2006
Posts: 1
 
      10-12-2006
It's been a long time since you posted this, however, I am exactly in your shoes at this point. Can you please suggest what you did to resolve this issue if you happen to remember.

I'll appreciate your response.

Regards,
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Axis 2 using WSDL2Java with more wsdl files Alessandro Java 0 06-04-2009 10:37 AM
Deserialize XML-File to Axis-generated Object pico77 Java 1 07-29-2008 07:18 AM
AXIS jars org.apache.axis.wsi.* and org.apache.axis.transport.jms.* unkwb@web.de Java 0 02-23-2005 04:02 PM
wsdl2java axis class not found eq Java 1 10-15-2004 07:01 PM
Problem with Apache AXIS WSDL2Java Sandy Dunlop Java 1 10-04-2003 10:56 PM



Advertisments