Getting raw XML SOAP-response on client side using ADB-stubs created by AXIS2

前端 未结 5 1786
天涯浪人
天涯浪人 2021-01-04 21:30

I access a SOAP service using ADB-stubs created by AXIS2. I would like to log the raw XML response of any Axis Fault, that is returned by the service. I can catch those erro

5条回答
  •  我在风中等你
    2021-01-04 22:13

    As suggested by joergl I changed my ADB-stubs to JAX-WS-ones using a "SOAPHandler" to log requests, responses and faults following the description here: http://www.mkyong.com/webservices/jax-ws/jax-ws-soap-handler-in-client-side/

    My handler looks like this for logging the nicely formated XML using log4j:

    public class RequestResponseHandler  implements SOAPHandler {
    
        private static Logger log = Logger.getLogger(RequestResponseHandler.class);
        private Transformer transformer = null;
        private DocumentBuilderFactory docBuilderFactory = null;
        private DocumentBuilder docBuilder = null;
    
        public RequestResponseHandler() {
            try {
                transformer = TransformerFactory.newInstance().newTransformer();
                transformer.setOutputProperty(OutputKeys.INDENT, "yes");
                transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "5");
                docBuilderFactory = DocumentBuilderFactory.newInstance();
                docBuilder = docBuilderFactory.newDocumentBuilder();
            } catch (TransformerConfigurationException
                    | TransformerFactoryConfigurationError
                    | ParserConfigurationException e) {
                log.error(e.getMessage(), e);
            }
        }
    
        @Override
        public void close(MessageContext arg0) {
        }
    
        @Override
        public boolean handleFault(SOAPMessageContext messageContext) {
            log(messageContext);
            return true;
        }
    
        @Override
        public boolean handleMessage(SOAPMessageContext messageContext) {
            log(messageContext);
            return true;
        }
    
        private void log(SOAPMessageContext messageContext) {
            String xml = "";
            SOAPMessage msg = messageContext.getMessage();
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            try {
                msg.writeTo(out);
                xml = out.toString("UTF-8");
            } catch (Exception e) {
                log.error(e.getMessage(),e);
            }       
    
            String direction = "";
            Boolean outbound = (Boolean) messageContext.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); 
            if (outbound) { 
                direction += "Request: \n"; 
            } else { 
                direction += "Response: \n";
            } 
    
            log.info(direction + getXMLprettyPrinted(xml));     
        }
    
        @Override
        public Set getHeaders() {
            return Collections.emptySet();
        }
    
    
        public String getXMLprettyPrinted(String xml) {
    
            if (transformer == null || docBuilder == null)
                return xml;
    
            InputSource ipXML = new InputSource(new StringReader(xml));
            Document doc;
    
            try {
                doc = docBuilder.parse(ipXML);
                StringWriter stringWriter = new StringWriter();
                StreamResult streamResult = new StreamResult(stringWriter);
                DOMSource domSource = new DOMSource(doc);
                transformer.transform(domSource, streamResult);
                return stringWriter.toString();
            } catch (SAXException | IOException | TransformerException e) {
                log.error(e.getMessage(), e);
                return xml;
            }
        }
    }
    

    In addition I wanted to reuse the raw XML in my application code. So I had to transfer this data from the SOAPHandler back to my client code. How to this was not too obvious. More about this problem can be found in this article: How to send additional fields to soap handler along with soapMessage?

提交回复
热议问题