Sure thing.  Let me know if you have any questions and
I'll do my best to answer them.  Or if you find anything
else out new, please share.  =]

|)ave

On Thu, 2002-06-13 at 15:20, St-Germain, Sylvain wrote:
> That is interresting.  Thanks for the code.  
> Sylvain.
> 
> -----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]
> 
> On Wed, 2002-06-12 at 13:11, Sam Kapoor wrote:
> > Hi Sylvain:
> > 
> > Yes that's what I thought too.  If I can throw an AxisFault then I 
> > should be able to throw a descendant.
> > Well actually the exception class that I have defined on my server side 
> > is a descendant of Exception.
> > EInvalidCustomer = class(Exception)
> > 
> > And I am throwing that on my server.
> > If I catch it on the client it never goes to that catch block.  It will 
> > however go to an AxisFault catch block.
> > I think that custom exception mappings is not yet supported in Axis.
> > 
> > Any custom Java exception is converted to an AxisFault by the Axis 
> > Engine and on the client you can catch an AxisFault but not an 
> > EInvalidCustomer
> > 
> > If you get this to work please let me know.
> > 
> > Thanks:
> > 
> > -Sam
> > 
> > St-Germain, Sylvain wrote:
> > 
> > >I may be misunderstanding your question but since I can throw an AxiFault
> > >shouldn't I be able to throw a descendent of AxisFault and, assuming it
> is a
> > >known type, expect the serialization to occur?
> > >
> > >Sylvain.
> > >
> > >
> > >-----Original Message-----
> > >From: Bob Cotton [mailto:[EMAIL PROTECTED]]
> > >Sent: Tuesday, June 11, 2002 8:41 PM
> > >To: [EMAIL PROTECTED]
> > >Subject: Re: Custom Exceptions
> > >
> > >
> > >>>>>>"Sam" == Sam Kapoor <[EMAIL PROTECTED]> writes:
> > >>>>>>
> > >
> > >    Sam> Hi: what I want to do is write a custom exception class and
> > >    Sam> propagate it from one of the methods on my Web-Service to the
> > >    Sam> client.  So I define a Java exception class:
> > >
> > >    Sam> public class EInvalidCustomer extends Exception {
> > >    Sam>  public EInvalidCustomer(String err){
> > >    Sam>   super(err);
> > >    Sam>  }
> > >
> > >    Sam> The method on my web-service throws this EInvalidCustomer
> > >    Sam> exception.  Now I run the WSDL2Java and I get public class
> > >    Sam> EInvalidCustomer extends org.apache.axis.AxisFault
> > >
> > >    Sam> Also in my WSDL I have a <wsdl:fault
> > >    Sam> message="intf:EInvalidCustomer" name="EInvalidCustomer"/>
> > >
> > >    Sam> So in my client when I call the method I catch 2 exceptions,
> > >    Sam> 1 is the RemoteException and the other is EInvalidCustomer
> > >    Sam> excpetion.  However, the catch is always going to the
> > >    Sam> RemoteException.  Now if I replace EInvalidCustomer with
> > >    Sam> AxisFault then the catch will go to the AxisFault.
> > >
> > >
> > >    Sam> I cannot find any example on Axis doc's that show how to pass
> > >    Sam> a custom exception class.
> > >    Sam> Do you have any ideas????
> > >
> > >Working through this same issue now. 
> > >
> > >Axis can describe the Exception in the WSDL (as you've discovered),
> > >but actually SENDING the data is not implemented.
> > >
> > >Until this happens I'm hacking something in using custom Handlers and
> > >SOAP headers to pass the data in my exception.
> > >
> > >Can the development guys shed some light on this? Possibly by beta3?
> > >
> > >Thanks
> > >- Bob
> > >
> > 
> -- 
> And in my spare time, I think I'll write some code.
> 
> This message may contain privileged and/or confidential information.  If you
> have received this e-mail in error or are not the intended recipient, you
> may not use, copy, disseminate or distribute it; do not open any
> attachments, delete it immediately from your system and notify the sender
> promptly by e-mail that you have done so.  Thank you.
-- 
And in my spare time, I think I'll write some code.

Reply via email to