How to get incoming & outgoing soap xml in a simple way using Apache CXF?

后端 未结 4 1005
走了就别回头了
走了就别回头了 2020-12-03 00:24

I have been fiddling around with server side interceptors on CXF. But is seems that it is not a trivial task to implement simple incoming and outgoing interceptors that give

4条回答
  •  孤城傲影
    2020-12-03 00:35

    I just want to share one more option, how to get incoming and outgoing messages together at the same time for some logging purpose, for example log requests and corresponding responses to database.

    import javax.xml.namespace.QName;
    import javax.xml.soap.SOAPMessage;
    import javax.xml.soap.SOAPPart;
    import javax.xml.transform.TransformerException;
    import javax.xml.transform.TransformerFactory;
    import javax.xml.transform.dom.DOMSource;
    import javax.xml.transform.stream.StreamResult;
    import javax.xml.ws.handler.MessageContext;
    import javax.xml.ws.handler.soap.SOAPHandler;
    import javax.xml.ws.handler.soap.SOAPMessageContext;
    import java.io.StringWriter;
    import java.util.Collections;
    import java.util.Set;
    
    public class CxfLoggingHandler implements SOAPHandler {
    
    private static final String SOAP_REQUEST_MSG_KEY = "REQ_MSG";
    
    public Set getHeaders() {
        return Collections.EMPTY_SET;
    }
    
    public boolean handleMessage(SOAPMessageContext context) {
        Boolean outgoingMessage = (Boolean) context.get (MessageContext.MESSAGE_OUTBOUND_PROPERTY);
        if (outgoingMessage) {
            // it is outgoing message. let's work
            SOAPPart request = (SOAPPart)context.get(SOAP_REQUEST_MSG_KEY);
            String requestString = convertDomToString(request);
            String responseString = convertDomToString(context.getMessage().getSOAPPart());
            String soapActionURI = ((QName)context.get(MessageContext.WSDL_OPERATION)).getLocalPart();
            // now you can output your request, response, and ws-operation    
        } else {
            // it is incoming message, saving it for future
            context.put(SOAP_REQUEST_MSG_KEY, context.getMessage().getSOAPPart());
        }
        return true;
    }
    
    public boolean handleFault(SOAPMessageContext context) {        
        return handleMessage(context);
    }
    
    private String convertDomToString(SOAPPart soap){
        final StringWriter sw = new StringWriter();
        try {
            TransformerFactory.newInstance().newTransformer().transform(
                    new DOMSource(soap),
                    new StreamResult(sw));
        } catch (TransformerException e) {
            // do something
        }
        return sw.toString();
    }
    }
    

    and then connect that handler with webservice

    
        
            
        
    
    

提交回复
热议问题