CXF (実際には GroovyWS) を使用して、テキスト ノードを持つ 1 つの子ノードを持つ SOAP ヘッダーを生成するにはどうすればよいですか?
-
25-09-2019 - |
質問
次のような 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クラスにノードの子を追加することにまだ興味があります(そして答えを受け入れます)。
所属していません StackOverflow