日期和日期时间应该是序列化的SOAP(xml)消息

Him*_*shu 3 java datetime soap web-services xml-serialization

我们正在构建一个带有第三方SOAP Web服务的Java客户端,即我无法访问或控制服务器端代码.我们刚刚提供了该服务的WSDL描述文件.我们正在使用Axis 1(版本1.4).

我们遇到了与日期与日期时间序列化和反序列化相关的以下问题.所述wsdl定义了DateTime和DateRange两种类型

<xs:element minOccurs="0" name="DateTime" type="xs:dateTime"/>
<xs:element minOccurs="0" name="DateRange">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="Start" type="xs:date"/>
      <xs:element name="End" type="xs:date"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>
Run Code Online (Sandbox Code Playgroud)

其中xs前缀表示XML Schema,存在以下内容

xmlns:xs="http://www.w3.org/2001/XMLSchema" 
Run Code Online (Sandbox Code Playgroud)

轴wsdl2java生成Java对象,其中datetime字段的类型为Calendar,start,end字段的类型为java.util.Date

当序列化发生时,开始和结束字段被序列化为yyyy-mm-dd格式,例如2014-02-01但是当实际调用到服务器端时,我们收到以下响应

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Header/>
   <SOAP-ENV:Body>
      <SOAP-ENV:Fault>
         <faultcode>SOAP-ENV:Server</faultcode>
         <faultstring xml:lang="en">JiBX unmarshalling exception; nested exception is org.jibx.runtime.JiBXException: Missing 'T' separator in dateTime</faultstring>
      </SOAP-ENV:Fault>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Run Code Online (Sandbox Code Playgroud)

我们使用SOAP UI直接构建请求xml有效负载,并观察如果我们只在开始和结束字段中传递日期部分,我们得到完全相同的响应,而如果我们传递这两个字段的时间部分,如dateTime字段,它工作,给出否故障信息.

这与我从xs:datexs:dateTime的 XMLSchema文档中可以发现的内容一起 ,特别是词法和规范表示部分,似乎意味着

  1. 基于轴的开始和结束字段序列化为yyyy-mm-dd并忽略时间部分是正确的.生成的客户端代码符合提供给我们的WSDL.

  2. 服务器端代码不符合提供给我们的WSDL,它需要dateTime字段而不是date字段.

  3. 由于日期和日期时间字段需要通过模式定义以不同格式进行序列化.在尝试反序列化消息时,服务器端失败的结果

为了验证我们的假设1.我们使用Python的ZSI库来生成python存根并从中生成xml.
即使是序列化也以yyyy-mm-dd格式开始和结束,最后还有一个"Z".这再次无法在服务器端进行反序列化,即使此序列化格式符合XML Schema定义的xs:date

<ns1:Start>2014-02-05Z</ns1:Start>
Run Code Online (Sandbox Code Playgroud)

根据观察到的行为,文档和Python ZSI实验是否正确,有人可以确认我们是否形成了假设.或者如果我们遗漏了一些细节

Men*_*ild 7

嗯,你推断你的DateRange字段的开始和结束,但是消息显然是关于你的DateTime字段,它需要(如XML架构所说)日期部分和时间部分之间的T分隔符,而不是空格或任何其他字符.

请检查序列化DateTime字段的方式(不是开始或结束字段!).它必须是格式化的"yyyy-MM-dd'T'HH:mm:ss".