使用CXF(实际上是GroovyWS),如何使用一个具有文本节点的子节点生成SOAP标头?

Ted*_*eid 3 groovy web-services cxf header groovyws

我正在为.net SOAP服务创建一个Groovy客户端,它需要一个如下所示的soap标头:

<soap:Header>
    <HeaderInfo xmlns="http://foo.bar.com/ns">
        <token>abc-unique-token</token>
    </HeaderInfo>
</soap:Header>
Run Code Online (Sandbox Code Playgroud)

我找到了为CXF消息添加标题的常见问题,它让我几乎到了那里,但并不完全.他们为选项4提供的示例如下所示:

    List<Header> headers = new ArrayList<Header>()
    Header header = new Header(new QName("http://foo.bar.com/ns", "HeaderInfo"), 
        "abc-unique-token", new JAXBDataBinding(String.class))
    headers.add(header)

    proxy.client.getRequestContext().put(Header.HEADER_LIST, headers)
Run Code Online (Sandbox Code Playgroud)

使用此代码,我可以这样做:

<soap:Header>
    <HeaderInfo xmlns="http://foo.bar.com/ns">
        abc-unique-token
    </HeaderInfo>
</soap:Header>
Run Code Online (Sandbox Code Playgroud)

但是"HeaderInfo"节点缺少子"令牌"节点以包围"abc-unique-token",我不知道如何在那里获取它.

是否有一些简单的事情我可以传递给Header构造函数来创建该节点?

一篇单独的文章讨论了使用不同的技术,但是当我尝试使用它时,这会在SoapFactory周围抛出错误.

我发现的许多其他东西需要创建一些扩展AbstractPhaseInterceptor类的东西,带有一堆额外的代码,当我想要的是如此接近:).

Ted*_*eid 5

在确定我提到的单独帖子中的SOAPFactory方法需要saaj-impl.jar工作后,我能够使用它来使用它:

List<Header> headers = new ArrayList<Header>()
SOAPFactory sf = SOAPFactory.newInstance()
def authElement = sf.createElement(new QName("http://foo.bar.com/ns", "HeaderInfo"))
def tokenElement = authElement.addChildElement("token")
tokenElement.addTextNode("abc-unique-token")
SoapHeader tokenHeader = new SoapHeader(
    new QName("http://foo.bar.com/ns", "HeaderInfo"), authElement);
headers.add(tokenHeader);
proxy.client.getRequestContext().put(Header.HEADER_LIST, headers)
Run Code Online (Sandbox Code Playgroud)

我仍然好奇(并且会接受答案)围绕CXF推荐的方式并将节点子节点添加到Header类.