Com o CXF (na verdade, GroovyWs), como faço para gerar um cabeçalho de sabão com um nó filho com um nó de texto?
-
25-09-2019 - |
Pergunta
Estou criando um cliente groovy para um serviço de sabão .NET que requer um cabeçalho de sabão que se pareça com o seguinte:
<soap:Header>
<HeaderInfo xmlns="http://foo.bar.com/ns">
<token>abc-unique-token</token>
</HeaderInfo>
</soap:Header>
eu encontrei as perguntas frequentes para adicionar cabeçalhos às mensagens CXF E isso me deixa quase lá, mas não exatamente. O exemplo que eles dão para a opção 4 se parecem:
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)
Usando este código, posso fazer isso para fazer isso:
<soap:Header>
<HeaderInfo xmlns="http://foo.bar.com/ns">
abc-unique-token
</HeaderInfo>
</soap:Header>
Mas o nó "headerinfo" está faltando o nó do token da criança "para cercar" ABC-Unique-Token "e não tenho certeza de como colocá-lo lá.
Existe alguma coisa simples que eu possa passar para o construtor de cabeçalho para criar esse nó?
UMA postagem separada fala sobre o uso de uma técnica diferente, mas isso lança erros para mim em torno da fábrica de sabão quando tento usá -la.
Muitas das outras coisas que eu encontrei precisam criar algo que estenda uma classe abstrataPhaseInterceptor com um monte de código adicional, quando o que eu quero é tão perto :).
Solução
Consegui fazê-lo funcionar usando isso depois de descobrir que o método de sabão no post separado que mencionei necessário saaj-impl.jar para trabalhar:
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)
Ainda estou curioso (e aceitaria uma resposta) em torno de fazê -lo a maneira recomendada pela CXF e adicionar uma criança do nó à classe de cabeçalho.