Logging SOAP Requests in WEF

Some of my projects make extensive use of the web service call builder and I often need to look at the outgoing SOAP requests when a problem crops up. This is easy by turning on logging in the advanced section of the builder, but doing this on every instance of the builder is tedious.


JAX-WS SOAP Handler
I stumbled on this article where Rob Flynn describes a technique to handle SOAP requests from a central point using the bowstreet.serviceCall.jaxwsHandler override. I used this approach to add some log4j logging statements, this way I don't have to go into each builder and tweak the input and redeploy, I can just change the log4j.properties. Unbelievably, a google search shows that there are no other references to this override - not even in IBM's documentation. I have to wonder how many other awesome WEF features lay undocumented (ask me about pageprocessors.properties).

public class SoapHandler extends BaseJaxWsHandler {

static Logger logger = Logger.getLogger(SoapHandler.class);

/*
* Populate the user's identity into the SOAP request.
*
* @see com.canon.ws.BaseJaxWsHandler#handleOutboundMessage(javax.xml.ws.handler.soap.SOAPMessageContext)
*/
public boolean handleOutboundMessage(SOAPMessageContext context) {
// bail if logging not enabled
if (!logger.isInfoEnabled())
return;

try {
HashMap hm = (HashMap) context.get(com.ibm.websphere.webservices.Constants.REQUEST_TRANSPORT_PROPERTIES);
Set keys = hm.keySet();

logger.info(">> Start SOAP message log");
logger.info("calling Model=" + getWebappAccess().getModelName());
logger.info(this.getEndPointUrl(context));

for (Object key : keys){
logger.info("HTTP header -> " + key + "=" + hm.get(key));
}

logger.info(context.getMessage().getSOAPPart().getEnvelope());
logger.info(">> End SOAP message log\n");
} catch (SOAPException e) {
// we're just logging, not sure we care that an exception is thrown
}
}

}

The parent class BaseJaxWsHandler can be found on Rob's entry mentioned above.

Comments

Popular posts from this blog

How to Open QR Codes

Jim Henson predicted the end of the world

Meet Jasper!