我尝试使用Microsoft Exchange EWS协议,Microsoft提供了一个WSDL文件。我使用wsimport
生成了一个JAX-WS客户端库。
不幸的是,Microsoft的WSDL文件有问题。其中一个错误(显然)是所有SOAP请求参数都被定义为强制性的---除非它们不是,它们是可选的,在某些情况下我必须能够供应他们。
摘自WSDL文件:
<wsdl:operation name="GetUserAvailability">
<soap:operation soapAction="http://schemas.microsoft.com/exchange/services/2006/messages/GetUserAvailability" />
<wsdl:input>
<soap:header message="tns:GetUserAvailabilitySoapIn" part="Impersonation" use="literal"/>
<soap:header message="tns:GetUserAvailabilitySoapIn" part="TimeZoneContext" use="literal"/>
<soap:header message="tns:GetUserAvailabilitySoapIn" part="RequestVersion" use="literal"/>
<soap:body parts="GetUserAvailabilityRequest" use="literal" />
<soap:header message="tns:GetUserAvailabilitySoapIn" part="RequestVersion" use="literal"/>
</wsdl:input>
<wsdl:output>
...skipped...
</wsdl:output>
</wsdl:operation>
<wsdl:message name="GetUserAvailabilitySoapIn">
<wsdl:part name="GetUserAvailabilityRequest" element="tns:GetUserAvailabilityRequest" />
<wsdl:part name="Impersonation" element="t:ExchangeImpersonation"/>
<wsdl:part name="TimeZoneContext" element="t:TimeZoneContext" />
<wsdl:part name="RequestVersion" element="t:RequestServerVersion"/>
</wsdl:message>
<xs:element name="ExchangeImpersonation" type="t:ExchangeImpersonationType"/>
如果我用service.getUserAvailability(request, null, null, version)
来调用它,那么我在标题中会得到一个<ExchangeImpersonation xsl:nil="true"/>
元素,并且Exchange服务器会抱怨有一个无关元素。
因此,我想编辑WSDL文件以使这些参数正确可选。我已经尝试根据文档向各个地方添加wsdl:required=false
和minOccurs=0
的各种组合,但wsimport
似乎完全忽略了它们 - 结果代码保持不变。
我该怎么做?