从WSDL生成的客户端是否可以生成排除可选标头元素的请求?

时间:2011-11-23 22:57:04

标签: java wsdl jax-ws wsimport

我正在使用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请求中排除标题元素altogther来基本满足此可选标头要求?我的同事之间似乎存在一些争论,即这是否会违反WSDL定义的合同并导致服务返回错误。有一种说法是.Net客户端允许您从请求中排除标头,只需将其指定为null即可。

1 个答案:

答案 0 :(得分:1)

在进一步挖掘并与少数人交谈之后,我设法回答了我自己的问题。使用SOAP消息处理程序,我能够传入要删除的标题名称列表,如果存在,它们将从请求中删除。这个网站对于让我走上正轨非常宝贵:

http://technology.amis.nl/blog/12004/how-to-remove-unwanted-soap-header-elements-in-jax-ws