С CXF (на самом деле GroovyWS), как мне сгенерировать заголовок SOAP с одним дочерним узлом, имеющим текстовый узел? - PullRequest
3 голосов
/ 28 сентября 2010

Я создаю Groovy-клиент для службы .net SOAP, для которой требуется заголовок 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" отсутствует дочерний узел "token" для окружения "abc-unique-token", и я не уверен, как его туда вставить.

Есть ли какая-то простая вещь, которую я могу передать конструктору Header для создания этого узла?

A отдельный пост говорит об использовании другой техники, но это выдает мне ошибки вокруг SoapFactory, когда я пытаюсь его использовать.

Многое из того, что я обнаружил, связано с необходимостью создания чего-то, расширяющего класс AbstractPhaseInterceptor с помощью набора дополнительного кода, когда то, что я хочу, так близко:).

1 Ответ

5 голосов
/ 28 сентября 2010

Я смог заставить его работать, используя это после выяснения, что методу 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.

...