Я нахожусь на этапе, когда я создал перехватчик вывода и получаю OuputStream из сообщения SOAP. Но как мне изменить конверт SOAP прямо перед его отправкой в конечную точку? Я хотел бы удалить некоторые элементы xml.
Как изменить сгенерированный SOAP-запрос?
Ответы (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 также должен соблюдать порядок их настройки, если они выполняются на одной и той же фазе.
но не верьте мне на слово... проверьте их для получения дополнительной информации
- http://cxf.apache.org/docs/interceptors.html
- http://fusesource.com/docs/esb/4.2/cxf_interceptors/CXFInterceptorIntro.html
отладка исходного кода CXF также очень помогла мне понять, как это работает.
---- РЕДАКТИРОВАТЬ ----
(спасибо Даниил :-)
Чтобы это работало, вам необходимо настроить SAAJOutInterceptor в вашем стеке. Вы можете либо добавить его вручную, либо просто сделать его частью вашего перехватчика. Вот пример перехватчика, который в значительной степени делает то, что вы хочу.
Обратитесь к этой ссылке для описания фаз Interceptor.
Я разместил ответ здесь https://stackoverflow.com/a/12948702/792313 Он основан на замене всего тела .