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,因为它提供了对响应和错误的更多可见性和控制。
我在将 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,因为它提供了对响应和错误的更多可见性和控制。