Uploaded image for project: 'JBoss Web Services'
  1. JBoss Web Services
  2. JBWS-800

ClassCastException when trying to marshal a subclass of Date

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Done
    • Icon: Major Major
    • jbossws-1.2.0
    • jbossws-1.0.0.CR4
    • jbossws-native
    • None

      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.

              tdiesler@redhat.com Thomas Diesler
              CBax007 Chris Baxter (Inactive)
              Votes:
              5 Vote for this issue
              Watchers:
              2 Start watching this issue

                Created:
                Updated:
                Resolved: