I wrote a log handler (extending BasicHandler) that traps various info on
the server side of a SOAP request/response.

One of the problems I ran into was that, if an AxisFault is thrown on the
server, I could not get my log handler to spit out any useful information
about the nature of the error.  Of course, I implemented an onFault()
method in the handler, which, although it gets called, does not give me a
way to log the nature of the error.  The problem is that onFault() only has
the MessageContext passed in, and MessageContext does not contain any of
the error information.  I know that I can always use the build-in
class-level log4j stuff in Axis to turn on logging for, say, the
SimpleChain class, but I want complete control over the log file format etc
in a unified fashion, so I prefer to put it right into my CustomLogHandler
class.

Two qusetions:
1) What is the preferred method of solving this problem?
2) Is the following solution (which I implemented and works fine)
reasonable, and if so should it be put into the CVS code of
SimpleChain.java?:
      I modified SimpleChain.java so that in doVisiting() where it catches
the AxisFault it populates a new property in MessageContext with the
exception message, prior to calling onFault() on the handlers in the chain.
My handlers can therefore grab this error info when their onFault() methods
are called.  More precisely:


    //  From SimpleChain.java:
    private void doVisiting(MessageContext msgContext,
                            HandlerIterationStrategy visitor) throws
AxisFault {
        int i = 0 ;
        try {
            Enumeration enum = handlers.elements();
            while (enum.hasMoreElements()) {
                visitor.visit((Handler)enum.nextElement(), msgContext);
                i++;
            }
        } catch( AxisFault f ) {
            // notify fault in reverse order and then rethrow
            log.error( JavaUtils.getMessage("axisFault00"), f );

             //
             // THE FOLLOWING LINE IS THE MODIFICATION:
             //
             msgContext.setProperty("FAULT_MESSAGE", f.getMessage());

            while( --i >= 0 )
                ((Handler) handlers.elementAt( i )).onFault( msgContext );
            throw f;
        }
    }

Any insight is greatly appreciated!
- Chad Stone


Reply via email to