Java中CXF SOAP客户端如何提取未生成对应字段的orderId?
提取SOAP响应中的orderId解决方案
方法一:直接操作DOM节点
利用CXF返回对象中的DOM节点属性提取orderId,步骤如下:
- 获取返回的
InsertOrderResult对象,从中拿到Result实例 - 将
Result的content列表中的第一个元素强转为DOMNode,再获取对应的Element - 直接提取
orderId节点的文本内容
示例代码:
// 假设已获取接口返回的InsertOrderResult对象 InsertOrderResult insertResult = ...; Result resultNode = insertResult.getResult(); // 转换为DOM元素 Element resultElement = (Element) ((DOMNode) resultNode.getContent().get(0)).getNode(); Element orderIdElement = (Element) resultElement.getFirstChild(); String orderId = orderIdElement.getTextContent().trim();
方法二:修改CXF生成类的绑定配置
通过自定义绑定文件,让wsdl2java生成包含orderId字段的Result类,避免手动解析:
- 创建绑定文件
binding.xml,指定对Result类型的扩展:
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" version="2.1" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <jaxb:bindings schemaLocation="你的服务WSDL地址或本地路径"> <!-- 定位到Result对应的复杂类型 --> <jaxb:bindings node="//xsd:complexType[@name='Result']"> <jaxb:bindings node="//xsd:sequence"> <!-- 添加orderId字段映射 --> <jaxb:property name="orderId"/> </jaxb:bindings> </jaxb:bindings> </jaxb:bindings> </jaxb:bindings>
- 重新执行wsdl2java命令,引入绑定文件:
wsdl2java -b binding.xml 你的WSDL地址
重新生成的Result类会自动包含getOrderId()方法,直接调用即可获取值。
方法三:手动解析完整SOAP响应XML
如果上述方法不适用,可以直接拿到完整的响应XML字符串,用XPath解析:
// 假设已获取完整的SOAP响应XML字符串 String soapResponse = ...; // 初始化DOM解析器 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(true); Document doc = factory.newDocumentBuilder().parse(new InputSource(new StringReader(soapResponse))); // 设置命名空间上下文 XPath xpath = XPathFactory.newInstance().newXPath(); xpath.setNamespaceContext(new NamespaceContext() { @Override public String getNamespaceURI(String prefix) { if ("soap".equals(prefix)) { return "http://schemas.xmlsoap.org/soap/envelope/"; } else if ("svc".equals(prefix)) { return "service URL"; // 替换为实际的服务命名空间 } return XMLConstants.NULL_NS_URI; } @Override public String getPrefix(String namespaceURI) { return null; } @Override public Iterator<String> getPrefixes(String namespaceURI) { return null; } }); // 执行XPath查询获取orderId String orderId = xpath.evaluate("/soap:Envelope/soap:Body/svc:InsertOrderResponse/svc:InsertOrderResult/svc:Result/orderId", doc).trim();
内容的提问来源于stack exchange,提问作者Mauricio Landos
相关产品推荐
相关产品推荐

