我正在使用 jax-ws 生成的代码创建一个客户端。使用的 WSDL 在绑定(bind)元素中指定了许多 header 元素,如下所示:
<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(以模拟未指定的值)或有效的 header 值作为 header5
的操作参数。要添加到请求中的值。这随后会创建一个 <header5>
没有子元素的元素。然后我遇到的问题是,消费服务似乎对该 header 元素进行了某种验证,并确定它是格式错误的,因为它通常包含一些不同的子元素。
因此,有没有一种方法可以使用 JAX-WS 通过从 SOAP 请求中完全排除 header 元素来从根本上满足此可选 header 要求?关于这是否会违反 WSDL 定义的契约并导致服务返回错误,我的同事之间似乎存在一些争论。有人声称 .Net 客户端允许您从请求中排除 header ,只需将其指定为空即可。
最佳答案
在进一步挖掘并与一些人交谈后,我设法回答了我自己的问题。使用 SOAP 消息处理程序,我能够传入要删除的 header 名称列表,如果存在,它们将从请求中删除。这个网站对我走上正轨非常重要:
http://technology.amis.nl/blog/12004/how-to-remove-unwanted-soap-header-elements-in-jax-ws
关于java - 从 WSDL 生成的客户端能否生成排除可选 header 元素的请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8250221/