Как изменить запрос веб-сервиса, используя перехватчики CXF с org.w3c.dom.Node - PullRequest
3 голосов
/ 21 сентября 2011

Использование CXF-перехватчика Я хотел бы добавить некоторый узел к XML-файлу, отправляемому на сервер.Я создал перехватчик (см. Ниже), который принимает сообщение как узел DOM, изменяет его и записывает обратно в объект сообщения.

К сожалению, код не работает должным образом - XML-файл, отправленный насервер не содержит «magicWord».ИМХО Я использую не ту фазу для этого.

Итак, вопрос: как я могу изменить исходящий запрос веб-сервиса, используя синтаксис org.w3c.dom.Node?

package dummy;

import org.apache.cxf.message.Message;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

class DummyInterceptor extends AbstractPhaseInterceptor {

    String magicWord = "abc";

    public DummyInterceptor() {
        super(Phase.PRE_PROTOCOL);
    }

    public void handleMessage(Message message) {
        Document document = (Document) message.getContent(Node.class);
        NodeList nodes = document.getElementsByTagName("wsse:Security");
        if (nodes.getLength() == 1) {
            Node wsseSecurityNode = nodes.item(0);
            wsseSecurityNode.appendChild(document.createTextNode(magicWord));
        }
        message.setContent(Node.class, document);
    }
}

1 Ответ

5 голосов
/ 23 сентября 2011

Наконец-то я сам узнал, как это сделать.

  • перехватчик должен использовать 'Phase.PRE_PROTOCOL'
  • перехватчик должен использовать addAfter (SaajOutInterceptor) - SaajOutInterceptor предоставляет узел в сообщении
  • класс перехватчика должен быть производнымиз AbstractSoapInterceptor
  • handleMessage перехватчика не выполняет грязную работу по изменению самого DOM, а добавляет новый перехватчик к сообщению с помощью message.getInterceptorChain (). add (...).
  • предполагается, что только что добавленный перехватчик модифицирует DOM
...