Как изменить сгенерированный SOAP-запрос?

Я нахожусь на этапе, когда я создал перехватчик вывода и получаю OuputStream из сообщения SOAP. Но как мне изменить конверт SOAP прямо перед его отправкой в ​​конечную точку? Я хотел бы удалить некоторые элементы xml.


person kiwifrog    schedule 02.08.2011    source источник


Ответы (3)


один из способов — получить документ и запустить его через XSLT-преобразование.

Вы можете получить документ в handleMessage вашего перехватчика, позвонив

@Override
public void handleMessage(SoapMessage message) throws Fault{
    SOAPMessage saaj = message.getContent(SOAPMessage.class);
    Document doc = saaj.getSOAPPart(); // This actually returns a SOAPPart instance but it does implement the w3c Document interface

    //play around with the document, doc is a reference so any changes made to that instance
    //will be forwarded to the rest of the chain
}

будьте осторожны, если у вас есть безопасность, такая как XML-подпись, которая должна выполняться для контента мыла, вы должны убедиться, что ваш перехватчик происходит ДО того, как подпись будет применена, иначе вы сделаете их недействительными.

Чтобы поиграть с синхронизацией перехватчика, вы можете указать фазу, на которой он будет работать. CXF также должен соблюдать порядок их настройки, если они выполняются на одной и той же фазе.

но не верьте мне на слово... проверьте их для получения дополнительной информации

отладка исходного кода CXF также очень помогла мне понять, как это работает.

---- РЕДАКТИРОВАТЬ ----

(спасибо Даниил :-)

Чтобы это работало, вам необходимо настроить SAAJOutInterceptor в вашем стеке. Вы можете либо добавить его вручную, либо просто сделать его частью вашего перехватчика. Вот пример перехватчика, который в значительной степени делает то, что вы хочу.

person Newtopian    schedule 02.08.2011
comment
Большое спасибо за ваш ответ Newtopian. message.getContent(SOAPMessage.class) всегда возвращает Null :-( На каком этапе я должен поместить этот код для доступа к SOAP Envelope, пожалуйста? - person kiwifrog; 02.08.2011
comment
Вам также нужно будет настроить SAAJOutInterceptor вместе с вашим перехватчиком, который выполняет преобразование. - person Daniel Kulp; 02.08.2011
comment
действительно, Даниэль прав, вам нужно убедиться, что SAAJOutInterceptor настроен, так как именно он сериализует данные в объект SOAPMessage. Он был включен в мои настройки по умолчанию, поэтому мне не пришлось слишком беспокоиться об этом. После настройки объект больше не будет нулевым, и вы сможете играть с деревом DOM по своему усмотрению. - person Newtopian; 02.08.2011
comment
с другой стороны, если вы хотите иметь больший контроль над XML, который проходит через стек, я мог бы порекомендовать Spring-WS вместо CXF. Это шаг, который я должен был сделать в своем проекте, CXF было просто трудно обойти, когда вариант использования начинает становиться странным. Стек Spring-WS несколько более открыт, что дает мне необходимые возможности без особых проблем. Тем не менее, CXF работает хорошо, и мне было легче начать работу, но он не обеспечивает достаточной гибкости. - person Newtopian; 02.08.2011

Обратитесь к этой ссылке для описания фаз Interceptor.

https://web.archive.org/web/20131003140105/http://fusesource.com/docs/esb/4.2/cxf_interceptors/CXFInterceptPhasesAppx.html

person user745079    schedule 20.02.2012
comment
ваша ссылка не работает и ведет к общему меню RedHat. Это всегда хорошая идея, чтобы обобщить, какая информация содержится в ссылке на случай, если это произойдет. - person cosbor11; 24.11.2015

Я разместил ответ здесь https://stackoverflow.com/a/12948702/792313 Он основан на замене всего тела .

person snowindy    schedule 18.10.2012