CxfPayload 对象不传播来自 SOAP 请求的值

CxfPayload object doesn't propagate values from the SOAP request

我在将 SOAP 请求从 CXF 负载格式转换为所需格式时遇到问题。

这是请求的样子:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soapenv:Header/>
   <soapenv:Body>
      <ObscureSOAPOperation xmlns="<wsdl-namespace-url>">
         <ObjectInfo>
            <value1>value1</value1>
            <value2>value2</value2>
         </ObjectInfo>
      </ObscureSOAPOperation>
   </soapenv:Body>
</soapenv:Envelope>

这就是我的路线:

from("properties:soapoperation.service.cxf.endpoint")
            .to("log:info?showAll=true")
            .process(new Processor() {
                @Override
                public void process(Exchange exchange) throws Exception {
                    CxfPayload<?> request = (CxfPayload<?>) exchange.getIn().getBody();
                    Source source = request.getBodySources().get(0);

                    JAXBElement<ObjectInfo> objectInfoElement =
                            jaxbContext.createUnmarshaller().unmarshal(source, ObjectInfo.class);

                    System.out.println("~~~~~~~~~Object Info value1: " + objectInfoElement.getValue().getValue1() + "~~~~~~~~~");
                }
            })

ObjectInfo 是生成的 WSDL class。顺便说一句,WSDL 是 rpc/literal 风格的 wsdl。

问题是当来自交易所的请求被投射到 CxfPayload 时。它变为空。 DOMSource 看起来像:

<ObjectInfo>
    <value1>null</value1>
    <value2>null</value2>
</ObjectInfo>

我的 SOAP 请求实际上在 ObjectInfo 之后包含更多元素(WSDL 具有特定 SOAP 请求的多部分消息),它们也是空的。

我找到了解决我的问题的临时方法。

我没有使用 Source,而是使用 XmlConverter 将正文转换为 String。然后将其解组为所需的对象类型。

@Override
public void process(Exchange exchange) throws Exception {
    CxfPayload<SoapHeader> request = exchange.getIn().getBody(CxfPayload.class);

    XmlConverter converter = new XmlConverter();
    String xmlInRequest = converter.toString(request.getBody().get(0).cloneNode(true), exchange);

    xmlInRequest = xmlInRequest.replace(" xmlns=\"<wsdl-namespace-url>\"", "");
    xmlInRequest = xmlInRequest.replace(" xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\"", "");
    xmlInRequest = xmlInRequest.replace(" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"", "");
    xmlInRequest = xmlInRequest.replace(" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"", "");
    xmlInRequest = xmlInRequest.replace("<?xml version=\"1.0\" encoding=\"utf-8\"?>", "");

    JAXBContext jaxbContext = JAXBContext.newInstance("com.rmg.globalrates.adapter.models");
    Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
    StreamSource streamSource = new StreamSource(new StringReader(xmlInRequest));
    ObjectInfo objectInfo  = (ObjectInfo) unmarshaller.unmarshal(streamSource);
    System.out.println("----------------------------ObjectInfo-----------------------" + objectInfo.toString());
}

CXF 似乎不支持 RPC。 RPC,这几天我所有烦恼的根源。

我会进一步尝试 CXF 消息格式和 convertBodyTo=String。

我喜欢 MESSAGE,因为它提供了对响应和错误的更多可见性和控制。