Использование сервиса CXF от Apache Верблюд возвращает пустое тело - PullRequest
0 голосов
/ 11 марта 2020

Я реализовал простой сервисный клиент SOAP в Camel, используя Spring DSL. Я направил его в мой фиктивный сервис, работающий в SoapUI, чтобы я мог видеть поступающие запросы и возвращаемые ответы. Я также настроил протоколирование перехватчиков. Что я наблюдаю, так это запрос, полученный SoapUI, и ответ возвращается и регистрируется как конверт SOAP с надлежащими данными в перехватчике регистрации, однако, когда я пытаюсь зарегистрировать тело сразу после вызова CXF, он пуст (не ноль, просто пустая строка). Вот моя конфигурация:

<cxf:cxfEndpoint id="soapEndpoint"
                 address="http://localhost:8088/mockServiceSoapBinding"
                 wsdlURL="wsdl/blah.wsdl"
                 serviceClass="my.schema.MyServicePortType"
                 endpointName="s:MyServicePort"
                 serviceName="s:MyService"
                 xmlns:s="http://com.foo">
    <cxf:outInterceptors>
        <ref bean="loggingOutInterceptor"/>
    </cxf:outInterceptors>
    <cxf:inInterceptors>
        <ref bean="loggingInInterceptor"/>
    </cxf:inInterceptors>
    <cxf:properties>
        <entry key="dataFormat" value="POJO"/>
    </cxf:properties>
</cxf:cxfEndpoint>

<camelContext id="main" xmlns="http://camel.apache.org/schema/spring">
    <route>
        <from uri="jetty:http://localhost:8181/callSoap"/>

        <setBody>
            <groovy>
                body = new MyRequest();
                ... populate the object here ...
                return body;
            </groovy>
        </setBody>

        <setHeader name="operationName">
            <constant>sendRequest</constant>
        </setHeader>
        <setHeader name="operationNamespace">
            <constant>http://com.foo</constant>
        </setHeader>

        <log message="****************** BEFORE CXF CALL ${body}" loggingLevel="INFO"/>

        <to uri="cxf:bean:soapEndpoint"/>

        <log message="****************** AFTER CXF CALL ${body}" loggingLevel="INFO"/>
    </route>
</camelContext>

А вот соответствующая часть журнала:

11:39:47.123 [default-workqueue-1] INFO  o.a.c.s.P.P.MyServicePortType - Inbound Message
----------------------------
ID: 1
Response-Code: 200
Encoding: UTF-8
Content-Type: text/xml; charset=utf-8
Headers: {Content-Length=[640], content-type=[text/xml; charset=utf-8], Server=[Jetty(6.1.26)]}
Payload: <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns0="http://com.foo">
   <soapenv:Header/>
   <soapenv:Body>
      <ns0:MyResponse>
      <!-- SOME XML HERE -->
      </ns0:MyResponse>
   </soapenv:Body>
</soapenv:Envelope>
--------------------------------------
11:39:47.168 [default-workqueue-1] INFO  route1 - ****************** AFTER CXF CALL 

Что я делаю не так?

1 Ответ

0 голосов
/ 12 марта 2020

ОК, я вроде понял, я добавил следующий код:

<bean id="prepareResponse" class="com.dummy.PrepareResponse"/>

и вызвал его сразу после вызова CXF, например,

<process ref="prepareResponse"/>

Код бина очень прост:

@Override
    public void process(Exchange exchange) throws Exception {
        Object[] result = exchange.getIn().getBody(Object[].class);
        exchange.getOut().setBody(result[0]);
    }
...