3

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

<soap:Header>
    <HeaderInfo xmlns="http://foo.bar.com/ns">
        <token>abc-unique-token</token>
    </HeaderInfo>
</soap:Header>

我找到了为 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)

使用这段代码,我可以让它做到这一点:

<soap:Header>
    <HeaderInfo xmlns="http://foo.bar.com/ns">
        abc-unique-token
    </HeaderInfo>
</soap:Header>

但是“HeaderInfo”节点缺少围绕“abc-unique-token”的子“token”节点,我不知道如何将它放在那里。

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

一篇文章讨论了使用不同的技术,但是当我尝试使用它时,这会在 SoapFactory 周围引发错误。

当我想要的东西如此接近时,我发现的许多其他东西都需要使用一堆额外的代码来创建扩展 AbstractPhaseInterceptor 类的东西:)。

4

1 回答 1

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)

我仍然对按照 CXF 推荐的方式进行操作并将节点子节点添加到 Header 类感到好奇(并且会接受答案)。

于 2010-09-27T21:50:00.363 回答