Использование операции без тела с использованием camel-cxf-endpoint - PullRequest
0 голосов
/ 26 октября 2018

У меня есть исходный веб-сервис, который выполняет операцию, которая не принимает тело в качестве запроса. Это ожидаемый запрос:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
   <soap:Header/>
   <soap:Body/>
</soap:Envelope>

У меня есть служба поддержки пользователей, которая вызывает эту операцию, используя camel-cxf: cxfEndpoint. Конечная точка настроена на использование dataFormat как «Полезная нагрузка». Примерно так:

<camel-cxf:cxfEndpoint
        address="SOURCE_ENDPOINT"
        id="abcEndpoint" serviceClass="PATH_TO_GENERATED_SERVICE_CLASS">
        <camel-cxf:properties>
            <entry key="dataFormat" value="PAYLOAD"/>
        </camel-cxf:properties>
        <camel-cxf:outInterceptors>
            <ref component-id="wss4jOutInterceptor"/>
        </camel-cxf:outInterceptors>
    </camel-cxf:cxfEndpoint>

Я устанавливаю тело как нулевое во время вызова этой операции, ожидая, что CXFInterceptor обернет тело SOAPEnvelope. Однако, когда я звоню в службу, я получаю:

java.lang.IllegalArgumentException: элементы PayLoad не могут поместиться с частями сообщения операции BindingOperation. Пожалуйста, проверьте BindingOperation и PayLoadMessage

Я проверил сгенерированный ServiceClass из исходного wsdl, чтобы проверить, ожидает ли операция какое-либо тело. Вот метод, который он ожидает:

@WebMethod(operationName = "SomeOperation", action = "SomeOperation")
    @WebResult(name = "Result", targetNamespace = "namespace_for_the_service", partName = "data")
    public Result someOperation();

Я также пытался использовать XSLT для преобразования в XML, который не добавляет никаких элементов, но ничего не решает. Я что-то пропустил? Это из-за dataFormat, который является полезной нагрузкой?

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Мне удалось решить эту проблему, создав пустой CxfPayload:

List<Source> elements = new ArrayList<Source>();
CxfPayload<SoapHeader> cxfPayload = new CxfPayload<SoapHeader>(null, elements, null);
exchange.getIn().setBody(cxfPayload);

Это сработало для меня !!!!

0 голосов
/ 26 октября 2018

Разве ваш SOAP-конверт не должен содержать минимальное тело с хотя бы целевым вызванным методом?

<soap:Body>
    <m:SomeOperation xmlns:m="..."/>                 
</soap:Body>
...