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:date和xs:dateTime的 XMLSchema文档中可以发现的内容一起 ,特别是词法和规范表示部分,似乎意味着
基于轴的开始和结束字段序列化为yyyy-mm-dd并忽略时间部分是正确的.生成的客户端代码符合提供给我们的WSDL.
服务器端代码不符合提供给我们的WSDL,它需要dateTime字段而不是date字段.
由于日期和日期时间字段需要通过模式定义以不同格式进行序列化.在尝试反序列化消息时,服务器端失败的结果
为了验证我们的假设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实验是否正确,有人可以确认我们是否形成了假设.或者如果我们遗漏了一些细节
嗯,你推断你的DateRange字段的开始和结束,但是消息显然是关于你的DateTime字段,它需要(如XML架构所说)日期部分和时间部分之间的T分隔符,而不是空格或任何其他字符.
请检查序列化DateTime字段的方式(不是开始或结束字段!).它必须是格式化的"yyyy-MM-dd'T'HH:mm:ss".
| 归档时间: |
|
| 查看次数: |
23856 次 |
| 最近记录: |