A few days ago, I added support for adding headers to a thrown AxisFault.

AxisFault fault = new AxisFault(...);
SOAPHeaderElement header = new SOAPHeaderElement(qname, contents);
fault.addHeader(header);
throw fault;

Does this give you what you're looking for?

--Glen

> -----Original Message-----
> From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]]
> Sent: Thursday, September 19, 2002 7:44 AM
> To: [EMAIL PROTECTED]
> Subject: FW: add header to a thorwn fault
> 
> 
> Hi,
> 
> Will Axis supports the SOAP headers addition to Fault ? Like 
> in case of FaultDetails ?
> 
> Br,
> Andras
> 
> [EMAIL PROTECTED]
> 
> -----Original Message-----
> From: ext David Owens [mailto:[EMAIL PROTECTED]]
> Sent: 18 September, 2002 16:28
> To: Avar Andras (NMP/Budapest)
> Subject: Re: add header to a thorwn fault
> 
> 
> Hi there!
> 
> With the last release of Axis, that functionality got stomped on.
> So we ended up basically doing the same thing in the invoke method.
> 
> So, we wrote a custom handler which looks for our custom exception
> and puts stuff in the header so that the data is transfered.
> 
> Attached is the class.
> 
> We had to make some code changes to the axis code as documented in the
> previous message.
> 
> Let me know if this helps.
> 
> |)ave
> 
> 
> On Wed, 2002-09-18 at 06:28, [EMAIL PROTECTED] wrote:
> > Hi David,
> > 
> > I have an important question according to the attached 
> letter, can you add some header to a Thrown exception in 
> onFault() function ? Or do you have any other solution for that ?
> > 
> > Thanks FW,
> > Andras
> > 
> > > -----Original Message-----
> > > From: David Owens [mailto:[EMAIL PROTECTED]]
> > > Sent: Thursday, June 13, 2002 11:48 AM
> > > To: [EMAIL PROTECTED]
> > > Subject: Re: Custom Exceptions
> > > 
> > > 
> > > Sam/Sylvain
> > > 
> > > Bob is on vacation, but I worked with him on this stuff, so I
> > > thought I'd post it out there for you so you could take a look
> > > at it....
> > > 
> > > We got our custom exception to work.  We had to make one hack to
> > > the axis code base to make it possible, and did the rest 
> with a handler.
> > > 
> > > We have an exception called SrmsException which extends exception.
> > > It has one data variable, and int called "code".  This exception
> > > is thrown from the server.  From that, we code-generate a client
> > > version which extends AxisFault, this is what we catch on the
> > > client.  To get the data (code) into the exception we had to do
> > > the following:
> > > 
> > > We hacked org.apache.axis.providers.java.JavaProvider.java  to
> > > put the data we need into the messageContext.  The JavaProvider
> > > catches the server exceptions (search for catch block in the file
> > > near processMessage()) and then rethrows it.  We changed it to
> > > catch it, put info in the context, and then throw it.  The code
> > > looks like this:
> > > 
> > >             try {
> > >                 processMessage(msgContext, clsName, 
> allowedMethods,
> > > reqEnv,
> > >                                resEnv, jc, obj);
> > >             } catch (Exception exp) {
> > >                 msgContext.setProperty("ThrownException", exp);
> > >                 throw exp;
> > >             } finally {
> > > 
> > > 
> > > That was the only change we had to make to axis.
> > > 
> > > Then we added a custome handler which sits in the chain 
> on the request
> > > to the server, in the chain for the response from the 
> server to client.
> > > (We did this by creating and adding the client-config.wsdd which
> > > introduces our handler in the globalConfiguration portion.)
> > > 
> > > Here is the code for our handler:
> > > 
> > > package com.synxis.srms.webservices.handlers (Sorry about the
> > > formatting):
> > > 
> > > import org.apache.axis.AxisFault;
> > > import org.apache.axis.Message;
> > > import org.apache.axis.MessageContext;
> > > import org.apache.axis.Constants;
> > > import org.apache.axis.message.SOAPEnvelope;
> > > import org.apache.axis.message.SOAPHeaderElement;
> > > import com.synxis.srms.webservices.client.exception.SrmsException;
> > > 
> > > 
> > > import org.apache.commons.logging.Log;
> > > import org.apache.commons.logging.LogFactory;
> > > 
> > > public class SrmsExceptionDataHandler extends
> > > org.apache.axis.handlers.BasicHandler {
> > > 
> > >     public void invoke(MessageContext msgContext) throws 
> AxisFault {
> > > 
> > >         if (msgContext.isClient()) {
> > >            if (msgContext.getPastPivot()) {
> > >                //System.out.println( "INVOKE CALLED" );
> > >                // This is a response.  Check it for the 
> session header.
> > >                Message msg = msgContext.getResponseMessage();
> > >                if (msg == null)
> > >                    return;
> > >                SOAPEnvelope env = null;
> > >                try {
> > >                    env = msg.getSOAPEnvelope();
> > >                }
> > >                catch (Exception e)
> > >                {
> > >                    System.out.println("Caught from 
> getSOAPEnvelope,
> > > trying again");
> > >                    env = msg.getSOAPEnvelope();
> > >                }
> > >                SOAPHeaderElement header =
> > > env.getHeaderByName("http://xml.apache.org/axis/exception";,
> > >                                                              
> > > "exceptionCode");
> > >                if (header == null)
> > >                    return;
> > > 
> > >                env.clearBody();
> > >                Integer code = null;
> > >                // Got one!
> > >                try {
> > >                    code = (Integer)header.
> > >                                 getValueAsType(Constants.XSD_INT);
> > >                } catch (Exception e) {
> > >                    throw AxisFault.makeFault(e);
> > >                }
> > > 
> > >                if(code != null)
> > >                {
> > >                    throw new SrmsException(code.intValue());
> > >                }
> > >            }
> > >         }
> > > 
> > >     }
> > > 
> > >     public void onFault(MessageContext msgContext)
> > >     {      
> > >        try
> > >        {
> > >            Exception e = (Exception)
> > > msgContext.getProperty("ThrownException");
> > > 
> > >            if (e != null && e instanceof
> > > java.lang.reflect.InvocationTargetException)
> > >            {
> > >                Throwable re =
> > > 
> ((java.lang.reflect.InvocationTargetException)e).getTargetException();
> > >                if (re instanceof
> > > com.synxis.srms.exception.SrmsException)
> > >                {
> > >                    com.synxis.srms.exception.SrmsException ex =
> > > (com.synxis.srms.exception.SrmsException)re;
> > >                    //System.out.println("Encoding 
> exception code in to
> > > header " + ex.getCode());
> > >                    Message msg = msgContext.getRequestMessage();
> > >                    if (msg == null)
> > >                        return;
> > > 
> > >                    SOAPEnvelope env = msg.getSOAPEnvelope();
> > >                    SOAPHeaderElement header = new
> > > SOAPHeaderElement("http://xml.apache.org/axis/exception";,
> > >                                                           
>          
> > > "exceptionCode",
> > >                                                           
>           new
> > > Integer(ex.getCode()));
> > >                    env.addHeader(header);
> > >                }
> > >            }
> > >        }
> > >        catch(Exception e)
> > >        {
> > >            System.out.println("Got exception in OnFault 
> in Handler");
> > >            e.printStackTrace();
> > >        }
> > >     }
> > > };
> > > 
> > > 
> > > So, on the request, if there is an fault, onFault() is called.  If
> > > the exception is one of our SrmsExceptions we get the code
> > > (ex.getCode()) and stick it in the header (env.addHeader(header)).
> > > 
> > > Then, on the response, to the client, we check for an envelope
> > > and a header.  If one exists we look for our header element and
> > > get the data (code) from it.  We then create a new SrmsException
> > > with the code as the value and throw that to be caught by the
> > > client.
> > > 
> > > The only strange thing we had to do (besides the rest of it. ;])
> > > was to clear the envelope body so that the original fault is
> > > not maintained and sent back to the client.
> > > 
> > > I hope this isn't too confusing, and I hope it helps.  As you can
> > > tell, we haven't cleaned it all up yet, but it works.  
> > > 
> > > |)ave
> > > 
> > > [EMAIL PROTECTED]
> 
> 

Reply via email to