CXF (実際には GroovyWS) を使用して、テキスト ノードを持つ 1 つの子ノードを持つ SOAP ヘッダーを生成するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/3807922

質問

次のような SOAP ヘッダーを必要とする .net SOAP サービス用の Groovy クライアントを作成しています。

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

見つけました CXF メッセージにヘッダーを追加するための FAQ そして、ほぼそこに到達しますが、完全ではありません。オプション 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 クラスを拡張するものを作成する必要があります:)。

役に立ちましたか?

解決

前述した別の投稿の 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クラスにノードの子を追加することにまだ興味があります(そして答えを受け入れます)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top