Log SOAP Messages
I created a class that intercepts the Request-Response cycle of SOAP message exchange and I wanted to log the exchange of messages. What's the best way so that I could log the SOAP message in my log file?
I dont want it to be pretty printed in my log file but I just want to access and view the request and response SOAP envelope.
I tried with this code:
public class LogHandler{
private static final Logger _LOG;
@Override
protected void handleResponse(SOAPMessage message)
logSOAPMessage(message);
}
@Override
protected void handleRequest(SOAPMessage message)
logSOAPMessage(message);
}
private void logSOAPMessage(SOAPMessage message){
_LOG.info(":: Logging SOAP Message :: " + message.toString());
}
}
But doesnt get the required message.
:: Logging SOAP Message :: oracle.j2ee.ws.saaj.soap.soap11.Message11@715开发者_开发技巧346
Any hints?
If message
is the SOAPMessage
then do the following:
ByteArrayOutputStream bout = new ByteArrayOutputStream();
message.writeTo(bout);
String msg = bout.toString("UTF-8");
Now String msg
has the soap message and you can log it.
In your example:
private void logSOAPMessage(SOAPMessage message){
ByteArrayOutputStream bout = new ByteArrayOutputStream();
message.writeTo(bout);
String msg = bout.toString("UTF-8");
_LOG.info(":: Logging SOAP Message :: " + msg);
}
What you are seeing is the toString of the SOAPMessage. You might have to lookup the javadocs to see if you can get the SOAPEnvelope from Oracle's SOAPMessage and that should contain the incoming/outgoing SOAP message.
Edit: Please check this for getSoapHeader() and getSoapBody() to deconstruct the soap message. You might have to figure out the same for Oracle's wrapper of SOAPMessage.
Cratylus' answer is insufficient when you don't want to log SOAP attachments.
Here's a way to log only the Envelope :
// Get the Envelope Source
Source src = message.getSOAPPart().getContent() ;
// Transform the Source into a StreamResult to get the XML
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "no");
StreamResult result = new StreamResult(new StringWriter());
transformer.transform(src, result);
String xmlString = result.getWriter().toString();
精彩评论