Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java date和datetime应该如何序列化SOAP(xml)消息_Java_Web Services_Datetime_Soap_Xml Serialization - Fatal编程技术网

Java date和datetime应该如何序列化SOAP(xml)消息

Java date和datetime应该如何序列化SOAP(xml)消息,java,web-services,datetime,soap,xml-serialization,Java,Web Services,Datetime,Soap,Xml Serialization,我们正在使用第三方SOAP Web服务构建java客户机,也就是说,我无法访问或控制服务器端代码。我们只提供了服务的WSDL描述文件。我们使用的是Axis1(版本1.4) 我们遇到了以下与日期与日期时间序列化和反序列化相关的问题。上述wsdl定义了两种类型DateTime和DateRange <xs:element minOccurs="0" name="DateTime" type="xs:dateTime"/> <xs:element minOccurs="0" name=

我们正在使用第三方SOAP Web服务构建java客户机,也就是说,我无法访问或控制服务器端代码。我们只提供了服务的WSDL描述文件。我们使用的是Axis1(版本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>
axis 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>

SOAP-ENV:服务器
JiBX解组异常;嵌套异常为org.jibx.runtime.JiBXException:dateTime中缺少“T”分隔符
我们使用SOAPUI直接构建请求xml负载,并观察到,如果我们只传递开始和结束字段中的日期部分,我们将得到完全相同的响应,而如果我们传递这两个字段的时间部分与dateTime字段类似,则不会给出错误消息

这与我可以从XMLSchema文档中获得的信息结合在一起 特别是词汇和规范表达部分,似乎暗示

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

  • 服务器端代码不符合提供给我们的WSDL,它需要一个日期时间字段而不是日期字段

  • 因为模式定义要求以不同的格式序列化date和dateTime字段。结果是,当它尝试反序列化时,它在服务器端失败 信息

  • 为了验证我们的假设1。我们使用Python的ZSI库生成Python存根和由此产生的xml。
    即使这样,也会以yyyy-mm-dd格式序列化开始和结束,并在结尾处添加一个“Z”。 即使这种序列化格式符合XML模式定义的xs:date,也无法在服务器端反序列化

    <ns1:Start>2014-02-05Z</ns1:Start>
    
    2014-02-05Z
    

    有人能确认我们根据观察到的行为、文档和Python的ZSI实验形成的假设是否正确吗。或者,如果我们缺少一些细节,您可以解释DateRange字段的开始和结束,但是消息显然是关于DateTime字段的,这需要(正如XML模式所说)日期部分和时间部分之间的T分隔符,而不是空格或任何其他字符


    请检查如何序列化DateTime字段(而不是开始或结束字段!)。它必须是格式
    “yyyy-MM-dd'T'HH:MM:ss”

    我已经检查过日期时间字段是否正确序列化。正如我通过SOAP UI提到的,我唯一更改的是从2014-02-03格式到2014-02-03T00:00:00格式的开始和结束字段,然后开始working@Himanshu很高兴你找到了解决办法。但我们可能会假设服务器端实现有问题(根据您的描述,这是一个黑匣子)。
    <ns1:Start>2014-02-05Z</ns1:Start>