Axis 1.4 对于Date和Calendar的处理

Posted on June 1, 2007

0


不管使用Date 还是 Calendar, Axis都会使用GMT标准时间,这样可能导致返回的时间和数据库中的时间不同。大家可以看看下面在org.apache.axis.encoding.ser.CalendarSerializer的代码:

private static SimpleDateFormat zulu =
       new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
static {
    zulu.setTimeZone(TimeZone.getTimeZone("GMT"));
}

明显的是如果使用Calendar对象,将会被format成GMT标准时间,即使Tomcat服务器所在的server时区是正确的也无法返回正确的时间。同样的,我测试过使用Date对象,也无法返回正确时间。

这个问题我认为比较好的解决方法是重新定义CalendarSerializer:

SimpleDateFormat format = new SimpleDateFormat(
  "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
return format.format(value);

这样强制使用本机的时区。需要注意的是自定义的CalendarSerializer必须要在部署文件wsdd中:

<typeMapping xmlns:ns="http://www.w3.org/2001/XMLSchema" 
   qname="ns:dateTime" type="java:java.util.Date" 
   serializer="com.CDRator.soap.util.DateSerializerFactory" 
   deserializer="com.CDRator.soap.util.DateDeserializerFactory" 
encodingStyle=""/>

目前还没有发现DateDeserializer工作不正常。

Posted in: Development