微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

今天发现一个很暴汗的问题!

    今天,一位同事发现一个很郁闷的问题,找我解决。然后我也郁闷了。

    我们为公司本身的应用开发基础平台,平台的功能以webservice形式提供出去,我们使用的是axis1.4和hessian-3.2.0提供服务。

    问题是这样的:

        服务端有一个类,有2个java.util.Date对象,用axis打成客户端为java.util.Calendar对象。如下:

                服务端

  1. private java.util.Date createdate;      // 创建日期
  2. private java.util.Date age;    // 使用期限

              客户端

  1. private java.util.Calendar createdate;
  2. private java.util.Calendar age;

             问题出现:

                 在服务端接口返回的对象中createdate=2017-04-13、age=2058-04-15。而客户端得到的对象中createdate=2058-04-15、age=2058-04-15。

               当时立刻换用Hessian协议来测试,发现无此问题。第一个反应就是axis在客户端的对象赋值过程中有bug(对axis真是很不看好。。之前用1.3版本出现其他严重的bug,另找时间说下。)。在生成的客户端代码中设置断点在setCreatedate(Calendar date1)和setAge(Calendar date2),调试。果然发现date1和date2都指向内存中的同一个Calendar对象。到这一步已经有点无语了,然后本着先怀疑自身的原则,再去测试工作流平台的代码(另外个平台,场景相同);发现竟然没有问题,很惊讶,然后对比2边的代码。最后只在Hiberate的映射上有点区别。在这个平台中对日期对象的映射为date,而工作流平台中映射为java.sql.Timestamp。如下:

  1. <property name="createdate" column="createdate" type="date"/>
  2. <property name="age" column="age" type="date"/>

            修改为:

  1. <property name="createdate" column="createdate" type="java.sql.Timestamp"/>
  2. <property name="age" column="age" type="java.sql.Timestamp"/>

            再测试,竟然没问题了!!

            得出一个结论:如果使用axis1.4(不知道其他版本如何),则Hiberate中对日期的映射date必须改为java.sql.Timestamp。

                而Hessian则无此问题。

            所以很郁闷,不知道有没有其他人遇到过类似的问题,原理如何,解惑一下?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐