如何提取打印出的SOAP XML响应并存储到变量中
从JAX-WS HTTP Dump输出中提取XML内容
我来帮你解决这个问题,从JAX-WS的HTTP dump输出里提取XML其实有两种常用的方式:一种是直接解析你已经拿到的控制台输出字符串,适合临时调试;另一种是用JAX-WS自带的Handler机制拦截消息,这种方式更可靠,适合正式代码场景。咱们一步步看:
方式一:解析控制台Dump字符串
你已经通过系统属性开启了HTTP dump,输出内容分为HTTP响应头和SOAP XML体两部分,XML内容从<?xml version='1.0' encoding='utf-8'?>开始,到</soapenv:Envelope>结束。你可以通过字符串截取的方式提取这部分内容:
// 假设dumpOutput是包含完整打印内容的字符串 String dumpOutput = "---[HTTP response - https://XXXXXXXXXXXXXXXXX/v1.0?wsdl - 200]---\nnull: HTTP/1.1 200 OK\nConnection: Keep-Alive\n...(你的完整dump内容)"; // 定义XML的起始和结束标记 String xmlStartMarker = "<?xml version='1.0' encoding='utf-8'?>"; String xmlEndMarker = "</soapenv:Envelope>"; // 查找标记的索引位置 int startIndex = dumpOutput.indexOf(xmlStartMarker); int endIndex = dumpOutput.indexOf(xmlEndMarker) + xmlEndMarker.length(); // 提取并验证XML内容 if (startIndex != -1 && endIndex != -1) { String extractedXml = dumpOutput.substring(startIndex, endIndex); // extractedXml就是你需要的XML内容,可存储到变量供后续使用 System.out.println("提取到的XML内容:\n" + extractedXml); } else { System.err.println("在dump输出中未找到完整的XML内容,请检查输出格式"); }
方式二:使用JAX-WS Handler拦截消息(推荐)
如果是在正式代码中,直接解析控制台输出不是最优方案,你可以用JAX-WS的SOAPHandler来直接拦截响应消息,这样能更可靠地获取XML内容,无需依赖控制台输出:
1. 实现SOAPHandler类
import javax.xml.namespace.QName; import javax.xml.soap.SOAPMessage; import javax.xml.ws.handler.MessageContext; import javax.xml.ws.handler.soap.SOAPHandler; import javax.xml.ws.handler.soap.SOAPMessageContext; import java.io.ByteArrayOutputStream; import java.util.Set; public class SOAPResponseHandler implements SOAPHandler<SOAPMessageContext> { // 存储提取到的XML内容(可根据需求调整为类成员变量供外部访问) private String responseXml; @Override public Set<QName> getHeaders() { return null; } @Override public boolean handleMessage(SOAPMessageContext context) { // 判断是否为响应消息(false表示入站,即服务端返回的响应) Boolean isOutbound = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); if (!isOutbound) { try { SOAPMessage soapMessage = context.getMessage(); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); soapMessage.writeTo(outputStream); // 将SOAP消息转换为XML字符串 responseXml = outputStream.toString("UTF-8"); // 这里可以直接对responseXml做后续处理,比如解析、存储等 System.out.println("拦截到的响应XML:\n" + responseXml); } catch (Exception e) { e.printStackTrace(); } } return true; // 继续处理消息链 } @Override public boolean handleFault(SOAPMessageContext context) { return true; } @Override public void close(MessageContext context) { // 清理资源(如果需要) } // 提供外部获取XML的方法 public String getResponseXml() { return responseXml; } }
2. 注册Handler到JAX-WS客户端
在创建JAX-WS客户端端口时,将上面的Handler添加到客户端的处理链中:
// 假设你的JAX-WS客户端服务类是InquiryService,端口类是InquiryPort InquiryService service = new InquiryService(); InquiryPort port = service.getInquiryPort(); // 获取BindingProvider并添加Handler BindingProvider bindingProvider = (BindingProvider) port; SOAPResponseHandler responseHandler = new SOAPResponseHandler(); bindingProvider.getBinding().getHandlerChain().add(responseHandler); // 调用服务方法 InquiryResponse response = port.yourInquiryMethod(yourRequest); // 获取提取到的XML内容 String extractedXml = responseHandler.getResponseXml(); // 后续使用extractedXml即可
这种方式不需要依赖控制台dump,直接在代码层面拦截消息,稳定性和可维护性更好。
内容的提问来源于stack exchange,提问作者Ajay Sharma
相关产品推荐
相关产品推荐

