使用camel-cxf-endpoint消耗没有内容的操作

时间:2018-10-26 08:55:06

标签: java web-services apache-camel cxf producer-consumer

我有一个源Web服务,该服务具有不以任何主体作为请求的操作。这是它期望的请求:

<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>

我在调用此操作时将主体设置为null,期望CXFInterceptor用SOAPEnvelope包装主体。但是,当我致电服务时,我得到:

  

java.lang.IllegalArgumentException:PayLoad元素不适合   与BindingOperation的消息部分一起使用。请检查   BindingOperation和PayLoadMessage

我检查了从源wsdl生成的ServiceClass,以检查操作是否需要任何主体。这是它期望的方法:

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

我还尝试使用XSLT转换为XML,该XML不添加任何元素但不能解决任何问题。我想念什么吗?是因为dataFormat是有效载荷吗?

2 个答案:

答案 0 :(得分:0)

您的SOAP信封是否不需要包含至少具有目标调用方法的最小主体?

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

答案 1 :(得分:0)

我能够通过创建一个空的CxfPayload来解决此问题:

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

这对我有用!!!