Как я могу обработать ответ RAW SOAP? - PullRequest
0 голосов
/ 18 марта 2019

У меня есть этот обработчик мыла:

@Slf4j
public class ResponseInterceptor implements SOAPHandler<SOAPMessageContext> {

    @Override
    public boolean handleMessage(SOAPMessageContext context) {
        try {
            SOAPMessage message = context.getMessage();
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            message.writeTo(out);
            String strMsg = new String(out.toByteArray());
        } catch (SOAPException | IOException e) {
            e.printStackTrace();
        }
        return false;
    }

Но я обрабатываю Запросы .Есть ли аналогичный способ обработки ответов ?

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

У меня есть следующая задача: мне нужно обработать все ответы RAW от службы SOAP, отфильтровать его и отправить вапач кафка.Я не хочу выполнять операцию демаршалинга и хочу отправить RAW-ответ kafka

EDIT2:

Я пишу перехватчик:

@Slf4j
public class ResponseInterceptor extends AbstractPhaseInterceptor<Message> {

    public ResponseInterceptor() {
        super(Phase.PRE_UNMARSHAL);
    }



    @Override
    public void handleMessage(Message message) throws Fault {
        try {
            SOAPMessage soapMessage = message.getContent(SOAPMessage.class);
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            soapMessage.writeTo(out);
            String strMsg = new String(out.toByteArray());
            message.getInterceptorChain().abort();
        } catch (SOAPException | IOException e) {
            e.printStackTrace();
        }
    }
}

Но если я позвоню message.getInterceptorChain().abort();Я получаю исключение в обслуживании.Но мне нужно просто затормозить этот отклик, а не доставку на веб-сервис

1 Ответ

2 голосов
/ 18 марта 2019

Перехватчики CXF «сами по себе» не связаны с запросами или ответами, по крайней мере, по двум причинам:

  • Многие перехватчики могут работать с обеих сторон (например, регистрация полезной нагрузки мыла)
  • Существует некоторая симметрия того, что должно быть сделано на стороне запроса / ответа, относительно клиент-серверной природы приложения.

Таким образом, работает CXF:что перехватчики связаны с «цепочками», которые CXF создает и управляет во время выполнения, и которые учитывают все комбинации перечисленного: IN, OUT, IN_FAULT, OUT_FAULT.Вы можете прочитать все о них здесь .

Если ваш текущий перехватчик обрабатывает «запросы», это означает одно из двух:

  • Если ваше приложение является серверомтогда ваш перехватчик связан с цепочкой «IN»
  • Если ваше приложение является клиентом, тогда ваш перехватчик связан с цепочкой «OUT»

Если вы хотитечтобы обрабатывать ответы и запросы, вам необходимо выяснить, как / где ваши пользовательские перехватчики связаны с цепочкой, которая обычно находится в файле конфигурации в CXF (см .: «написание и настройка перехватчиков» в ссылке abose).

Многие люди используют CXF с конфигурацией Spring, и поэтому добавляют перехватчики на весь уровень CXF (шины), например, так:

<bean id="MyInterceptor" class="demo.interceptor.MyInterceptor"/>
<!-- We are adding the interceptors to the bus as we will have only one endpoint/service/bus. -->
<cxf:bus>
    <cxf:inInterceptors>
        <ref bean="MyInterceptor"/>
    </cxf:inInterceptors>
    <cxf:outInterceptors>
        <ref bean="MyInterceptor"/>
   </cxf:outInterceptors>
</cxf:bus>

Но это также можно сделать на уровне enpoint.

Дальнейшее чтение: Как перехватить какие-либо исключения в методе веб-службы SOAP?

Доступ к содержимому до (не) сортировки

Я мог бы многое расширить,но я предлагаю тебепосмотрите на org.apache.cxf.interceptor.LoggingInInterceptor (или соответствующее для сообщений «Out»), они являются таким же хорошим примером, как вы можете видеть, «как получить доступ к необработанному контенту, не нарушая ничего».

...