我正在使用 jax-ws 生成的代码创建一个客户端。使用的 WSDL 在绑定元素中指定了许多类似这样的标头元素:
<wsdl:operation name="operation">
<wsoap12:operation soapActionRequired="false" style="document"/>
<wsdl:input>
<wsoap12:header message="tns:InMsg" part="header1" use="literal"/>
<wsoap12:header message="tns:InMsg" part="header2" use="literal"/>
<wsoap12:header message="tns:InMsg" part="header3" use="literal"/>
<wsoap12:header message="tns:InMsg" part="header4" use="literal"/>
<wsoap12:header message="tns:InMsg" part="header5" use="literal"/>
<wsoap12:body parts="request" use="literal"/>
</wsdl:input>
<wsdl:output>
<wsoap12:header message="tns:OutMsg" part="header1" use="literal"/>
<wsoap12:header message="tns:OutMsg" part="header2" use="literal"/>
<wsoap12:body parts="response" use="literal"/>
</wsdl:output>
<wsdl:fault name="standardError">
<wsoap12:fault name="standardError" use="literal"/>
</wsdl:fault>
</wsdl:operation>
我的问题围绕着,为了争论,header5
。根据我正在使用的规范,这是一个可选值。因此,我使用 JAX-WS 生成我的客户端,并且要么必须传递 null(以模拟未指定的值)或有效的标头值作为操作参数,以便将header5
值添加到请求中。这将随后创建一个<header5>
没有子元素的元素。然后我遇到的问题是消费服务似乎对该标头元素进行了某种验证,并确定它格式错误,因为它通常包含几个不同的子元素。
因此,有没有一种方法,使用 JAX-WS,通过从 SOAP 请求中完全排除 header 元素来基本上满足这个可选的 header 要求?对于这是否会违反 WSDL 定义的契约并导致服务返回错误,我的同事之间似乎存在一些争论。有一种说法是,.Net 客户端允许您从请求中排除标头,只需将其指定为空即可。