代码之家  ›  专栏  ›  技术社区  ›  Ted Naleid

对于cxf(实际上是groovyws),如何生成一个SOAP头,其中一个子节点有一个文本节点?

  •  3
  • Ted Naleid  · 技术社区  · 15 年前

    我正在为.NET SOAP服务创建一个groovy客户机,该服务需要一个如下所示的SOAP头:

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

    我发现 the faq for adding headers to CXF messages 它让我几乎达到了那里,但不是完全。他们为选项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”节点,我不知道如何将其放入其中。

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

    separate post 讨论使用不同的技术,但当我尝试使用它时,这会在SoapFactory周围给我带来错误。

    我发现的其他很多东西都需要创建一个扩展AbstractPhaseInterceptor类的东西,当我想要的是如此接近的时候,还需要一些额外的代码。

    1 回复  |  直到 15 年前
        1
  •  5
  •   Ted Naleid    15 年前

    我发现在我提到的单独的帖子中的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推荐的方式来做,并将一个子节点添加到头类中。

    推荐文章