[
http://jira.jboss.com/jira/browse/JBWS-800?page=comments#action_12350673 ]
Thomas Diesler commented on JBWS-800:
-------------------------------------
public void testMarshallSimpleUserTypeWithUserDate() throws Exception
{
class UserDate extends Date
{
public UserDate(long date)
{
super(date);
}
}
GregorianCalendar cal = new GregorianCalendar(1968, 11, 16);
UserDate userDate = new UserDate(cal.getTime().getTime());
SimpleUserType obj = new SimpleUserType(1, 2, userDate);
String exp =
"<ns1:SimpleUser xmlns:ns1='" + TARGET_NAMESPACE + "'
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>" +
" <a>1</a>" +
" <b>2</b>" +
" <d>1968-12-15T23:00:00.000Z</d>" +
"</ns1:SimpleUser>";
System.out.println("FIXME: [JBWS-800] ClassCastException when trying to marshal
a SybaseTimestamp");
//String was = marshalSimpleType(obj);
//assertEquals(DOMUtils.parse(exp), DOMUtils.parse(was));
}
ClassCastException when trying to marshal a subclass of Date
------------------------------------------------------------
Key: JBWS-800
URL:
http://jira.jboss.com/jira/browse/JBWS-800
Project: JBoss Web Services
Issue Type: Bug
Security Level: Public(Everyone can see)
Components: jaxrpc
Affects Versions: jbossws-1.0.0.CR4
Environment: Windows XP, JBoss 4.0.4.CR2
Reporter: Chris Baxter
Assigned To: Alexey Loubyansky
Fix For: jbossws-1.2.0
I have a EJB3 persistent bean mapped to a Sybase DB table. This table has datetime
column that I have mapped back to a java.util.Date property on the persistent bean. This
same bean class is returned from a webservice call. On JBoss 4.0.3SP1 (using Axis), I had
no issues returning this object from my finder call. Now, when I switch to JBoss 4.0.4CR2
(using JBossWS), I get the following exception:
Caused by: java.lang.ClassCastException: com.sybase.jdbc3.tds.SybTimestamp
at org.jboss.xb.binding.SimpleTypeBindings.marshal(SimpleTypeBindings.java:1150)
at
org.jboss.xb.binding.XercesXsMarshaller.marshalCharacters(XercesXsMarshaller.java:1169)
at
org.jboss.xb.binding.XercesXsMarshaller.marshalSimpleType(XercesXsMarshaller.java:451)
at
org.jboss.xb.binding.XercesXsMarshaller.marshalElementType(XercesXsMarshaller.java:405)
at org.jboss.xb.binding.XercesXsMarshaller.marshalElement(XercesXsMarshaller.java:380)
at
org.jboss.xb.binding.XercesXsMarshaller.marshalElementOccurence(XercesXsMarshaller.java:886)
at org.jboss.xb.binding.XercesXsMarshaller.marshalParticle(XercesXsMarshaller.java:823)
at
org.jboss.xb.binding.XercesXsMarshaller.marshalModelGroupSequence(XercesXsMarshaller.java:1102)
at
org.jboss.xb.binding.XercesXsMarshaller.marshalModelGroup(XercesXsMarshaller.java:1057)
at org.jboss.xb.binding.XercesXsMarshaller.marshalParticle(XercesXsMarshaller.java:729)
at
org.jboss.xb.binding.XercesXsMarshaller.marshalComplexType(XercesXsMarshaller.java:685)
at
org.jboss.xb.binding.XercesXsMarshaller.marshalElementType(XercesXsMarshaller.java:414)
at org.jboss.xb.binding.XercesXsMarshaller.marshalElement(XercesXsMarshaller.java:380)
at
org.jboss.xb.binding.XercesXsMarshaller.marshalElementOccurence(XercesXsMarshaller.java:886)
at org.jboss.xb.binding.XercesXsMarshaller.marshalParticle(XercesXsMarshaller.java:810)
at
org.jboss.xb.binding.XercesXsMarshaller.marshalModelGroupSequence(XercesXsMarshaller.java:1102)
at
org.jboss.xb.binding.XercesXsMarshaller.marshalModelGroup(XercesXsMarshaller.java:1057)
at org.jboss.xb.binding.XercesXsMarshaller.marshalParticle(XercesXsMarshaller.java:729)
at
org.jboss.xb.binding.XercesXsMarshaller.marshalComplexType(XercesXsMarshaller.java:685)
at
org.jboss.xb.binding.XercesXsMarshaller.marshalElementType(XercesXsMarshaller.java:414)
at org.jboss.xb.binding.XercesXsMarshaller.marshalElement(XercesXsMarshaller.java:380)
at
org.jboss.xb.binding.XercesXsMarshaller.marshalElementOccurence(XercesXsMarshaller.java:886)
at
org.jboss.xb.binding.XercesXsMarshaller.marshallInternal(XercesXsMarshaller.java:275)
at org.jboss.xb.binding.XercesXsMarshaller.marshal(XercesXsMarshaller.java:222)
at org.jboss.ws.jaxb.JAXBMarshallerImpl.marshal(JAXBMarshallerImpl.java:172)
at org.jboss.ws.jaxrpc.encoding.JAXBSerializer.serialize(JAXBSerializer.java:100)
at org.jboss.ws.soap.SOAPContentElement.getXMLFragment(SOAPContentElement.java:172)
at org.jboss.ws.soap.SOAPContentElement.expandToDOM(SOAPContentElement.java:844)
at org.jboss.ws.soap.SOAPContentElement.getChildNodes(SOAPContentElement.java:761)
at org.jboss.util.xml.DOMWriter.printInternal(DOMWriter.java:201)
at org.jboss.util.xml.DOMWriter.printInternal(DOMWriter.java:260)
at org.jboss.util.xml.DOMWriter.printInternal(DOMWriter.java:260)
at org.jboss.util.xml.DOMWriter.print(DOMWriter.java:177)
at org.jboss.util.xml.DOMWriter.printNode(DOMWriter.java:126)
at org.jboss.ws.server.ServiceEndpoint.postProcessResponse(ServiceEndpoint.java:306)
... 23 more
In looking at the source code, I think I see why there may be a problem:
else if(typeCode == XS_DATETIME)
{
Calendar c;
if(value.getClass() == java.util.Date.class)
{
c = Calendar.getInstance();
c.clear();
c.setTime((java.util.Date)value);
}
else
{
c = (Calendar)value;
}
result = marshalDateTime(c);
}
The SybaseTimestamp class extends java.sql.Timestamp which in turn extends
java.util.Date. That first 'if' should hit, but it won't because
SybaseTimestamp.class != java.util.Date.class. Instead, I think the if statement should
be:
if(java.util.Date.class.isAssignableFrom(value.getClass()))
I made this change and recompiled and everything works as expected now.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://jira.jboss.com/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira