Soap 如何访问camel cxf端点的有效负载主体

Soap 如何访问camel cxf端点的有效负载主体,soap,cxf,Soap,Cxf,我有基于CXF的Jax WS Web服务,并尝试读取请求的有效负载。 我将org.apache.camel.component.cxf.CxfEndpoint的数据格式设置为有效负载 我使用POST方法调用此服务,其主体为Soap信封,如下所示 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:loc="http://www.csapi.org/schema/parlay

我有基于CXF的Jax WS Web服务,并尝试读取请求的有效负载。 我将org.apache.camel.component.cxf.CxfEndpoint的数据格式设置为有效负载

我使用POST方法调用此服务,其主体为Soap信封,如下所示

   <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:loc="http://www.csapi.org/schema/parlayx/terminal_location/v2_0/local">
   <soapenv:Header/>
   <soapenv:Body>
      <loc:getLocation>
         <loc:address>tel:+948420161525</loc:address>
         <loc:requestedAccuracy>500</loc:requestedAccuracy>
         <loc:acceptableAccuracy>500</loc:acceptableAccuracy>
      </loc:getLocation>
   </soapenv:Body>
</soapenv:Envelope>

电话:+948420161525
500
500
这里的body是ParlayX协议的GetLocation对象的表示

在我的类中,我接收CxfPayload对象。我想从有效负载主体中检索地址和请求的准确性。 我试图从CxfPayload的getBodySources()和getBody()方法中提取所需的数据。但是没有成功。我在对象中看不到所需的数据

我从中引用了一些例子,但也没有成功


知道如何提取有效载荷的身体数据吗

有几种方法可以做到这一点。例如,您可以将其解组到POJO中,并使用Java方法访问它。或者,如果您只想从有效负载中获得一些值,则可以简单地使用XPath:

<setHeader headerName="address">
  <xpath>//loc:address/text()</xpath>
</setHeader>

您还可以分享您的骆驼端点定义吗?为什么需要从xml正文中提取?相反,您可以通过camel-jaxb组件将整个身体解析为对象和jaxb。还有一种替代方法,可以使用xpath提取这些数据。如果您明确了目标,我可以相应地帮助您。感谢bhdrkn,Ramin,我正在创建org.apache.camel.component.cxf.CxfEndpoint的新实例,并将负载设置为dataformat。在我的java类方法中,我将此负载作为CXFPayload获取。我试着将尸体解组到我的物体上,但无法得到它。如何在java端使用xpath?我不想修改我的有效负载。嗨,Ramin,字符串中的BODY_将是exchange.getIn().getBody(STRING.class)或exchange.getIn().getBody(Document.class)?当我使用exchange.getIn().getBody(String.class)时,我看到以下错误。net.sf.saxon.trans.XPathException:前缀loc尚未声明,当我使用Document Document=exchange.getIn().getBody(Document.class)时,能否尝试使用//address/text()?Ramin;我看到文档对象内容如下[#document:null]有任何其他更改可以解决这个问题吗?
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder;
builder = factory.newDocumentBuilder();
Document document = builder.parse(new InputSource(new StringReader(BODY_IN_STRING)));
XPath xPath = XPathFactory.newInstance().newXPath();

String address = xPath.evaluate("//loc:address/text()", document));