1 Reply Latest reply on Jul 6, 2006 4:59 PM by cbax007

    Possible bug in SimpleTypeBindings with java.sql.Date

    garethevans

      Hi,

      I have an issue using JBoss4.0.4GA and JBossWS1.0.1GA.

      My pojo:

      public class Client {
       private String username;
       private java.util.Date dateCreated;
      
       // getters and setters
      }
      


      When I create an instance of this class and try to send this via soap all works as expected but when this class is loaded via hibernate I get a classcastexception

      javax.xml.rpc.JAXRPCException: Cannot create or send response message
       at org.jboss.ws.server.ServiceEndpoint.postProcessResponse(ServiceEndpoint.java:296)
       at org.jboss.ws.server.ServiceEndpoint.handleRequest(ServiceEndpoint.java:221)
       at org.jboss.ws.server.ServiceEndpointManager.processSOAPRequest(ServiceEndpointManager.java:355)
       at org.jboss.ws.server.StandardEndpointServlet.doPost(StandardEndpointServlet.java:109)
       at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
       at org.jboss.ws.server.StandardEndpointServlet.service(StandardEndpointServlet.java:75)
       at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
       at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter
      ....
      Caused by: java.lang.ClassCastException: java.sql.Date
       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
      ....
      


      From looking at the code within fisheye you can see that only the type of java.util.Date is checked for:

      from SimpleTypeBindings
      
      else if(typeCode == XS_DATETIME)
      1140 {
      1141 Calendar c;
      1142 if(value.getClass() == java.util.Date.class)
      1143 {
      1144 c = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
      1145 c.clear();
      1146 c.setTime((java.util.Date)value);
      1147 }
      1148 else
      1149 {
      1150 c = (Calendar)value;
      1151 }
      1152 result = marshalDateTime(c);
      1153 }
      
      


      surely the line 1142 should either be changed to:

      if(value instanceof java.util.Date)


      or

      if((value.getClass() == java.util.Date.class) || (value.getClass() == java.sql.Date.class))



      Gareth