At 10:55 PM 9/28/2003 -0700, you wrote:
Anne -
I'm working on changes to accomplish this.
Gary
> -----Original Message----- > From: Anne Thomas Manes [mailto:[EMAIL PROTECTED] > Sent: Saturday, September 27, 2003 11:45 AM > To: [EMAIL PROTECTED] > Subject: RE: Soap Fault question > > > I think it makes sense to use Axis Fault to throw the > exception back to the > calling application (the stub or dynamic proxy), but I think > that some work > needs to be done in the SOAP message processor so that it > properly handles > SOAP faults. > > I expect Axis to return and process faults that look > something like this: > > <env:Body> > <env:Fault> > <faultcode>Client</faultcode> > <faultstring>User Exception: Record Not Found</faultstring> > <detail> > <RecordNotFound> > <CustID>12345</CustID> > <stackTrace> > stack trace > </stacktrace> > </RecordNotFound> > <detail> > </env:Fault> > </env:body> > > From what I've seen, Axis returns only the stack trace in > the <detail>. It > doesn't supply error information that a non-Java SOAP processor can > properly interpret. Does Axis Fault know how to process a > custom SOAP Fault > message? How do you configure Axis to catch an exception and > map it to a > custom SOAP Fault? And how do you configure Axis client to > find custom > information in the SOAP Fault details and map it to a > specific exception? > In my client app, I should be able to catch any custom SOAP > Fault message > -- not just remote exceptions. > > Anne > > At 09:54 AM 9/26/2003 -0700, you wrote: > >Ann, Steve -- > > > >I am working on a patch for Axis to implement just this > functionality. > >There is one small clarification, however. The Axis engine > is invoked > >on the client side via a call to javax.xml.rpc.Call.invoke(...). In > >Axis, this is actually implemented in org.apache.axis.client.Call. > > > >However, these methods are defined as throwing > >java.rmi.RemoteException. Therefore, any exception returned by the > >engine -must- be a RemoteException. The Axis engine is not > free to "map > >the SOAP fault to a local language exception and throw the > appropriate > >exception" since it cannot itself throw checked exceptions > unless they > >are RemoteExceptions. > > > >My solution is to enhance AxisFault, which extends > RemoteException, so > >that AxisFault knows if it is just a "wrapper" for an ordinary > >exception thrown on the server side. If so, it is the stub that is > >then responsible for unwrapping the AxisFault and throwing > the original > >exception. > > > >A .NET stub, for example, would also need to understand the > >deserialization of this AxisFault so that it could throw the > >corresponding exception on the .NET client side. > > > >Does this make sense? > > > >Gary > > > > > -----Original Message----- > > > From: Anne Thomas Manes [mailto:[EMAIL PROTECTED] > > > Sent: Friday, September 26, 2003 8:30 AM > > > To: [EMAIL PROTECTED] > > > Subject: Re: Soap Fault question > > > > > > > > > Steve, > > > > > > I don't think fault/exception behavior has been sufficiently > > > specified -- hence the interop issues. > > > > > > The way it should work is thus: > > > > > > On the server side: > > > Application throws an exception in its native language. The > > > exception routine should map the error to a SOAP fault. The SOAP > > > engine should return the SOAP fault. > > > > > > On the client side: > > > The SOAP engine receives the SOAP fault. It maps the SOAP > fault to a > > > local language exception and throws the appropriate exception. > > > > > > But to make that happen you need a way to properly configure the > > > SOAP engine to map the SOAP fault to the exception. > > > > > > When you have Java on both sides, the SOAP engines will > > > automatically handle throwing the appropriate exceptions for you, > > > but they don't really map the exceptions to specific SOAP faults. > > > Axis maps most exceptions to > > > Server.userException (which doesn't make any sense -- if > the error is > > > caused by the user, i.e., client -- then it should be mapped > > > to a Client > > > exception, not a Server exception). But anyway -- Axis > > > returns the Java > > > exception in the fault <details> element. If the client is > > > anything other > > > than Java, that exception won't be especially informative to > > > the client > > > application. > > > > > > Anne > > > At 10:33 AM 9/25/2003 -0500, you wrote: > > > > > > >Anyone else knowledgeable in Soap Faults have any comments on > > > >this? > > > > > > > >Steve > > > > > > > > > > > > > Steve, > > > > > > > > > > I am not knowledgeable enough to comment on whether your > > > > > expectations are > > > >too > > > > > high or not. However, it all boils down to WSDL to a > particular > > > > > language binding and how that binding maps SOAP > faults defined > > > > > in WSDL. I am not > > > >sure > > > > > whether there exists a standard language binding for each > > > language > > > > > (which > > > >may > > > > > or may not have a concept of exception e.g. a procedural > > > > > language like C) > > > >that > > > > > addresses SOAP fault to error handling strategy native to that > > > >programming > > > > > language. > > > > > Hope someone on the list can enlighten us ... > > > > > Thanks, > > > > > > > > > > Ajay > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > "Steve Pannier" <[EMAIL PROTECTED]> > > > > > > > > > > 09/24/2003 09:58 PM > > > > > > > > > > Please respond to > > > > > [EMAIL PROTECTED] > > > > > > > > > > > > > > > > > > > > To > > > > > [EMAIL PROTECTED] > > > > > cc > > > > > > > > > > Subject > > > > > Re: Soap Fault question > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Ajay, > > > > > > > > > > Thanks for the response. > > > > > > > > > > So maybe I'm not understanding the purpose for > describing Soap > > > > > faults in a WSDL file. I was under the impression > that a soap > > > > > implementation (regardless of language/programming > environment) > > > > > would create the appropriate "exception class" (or object, or > > > > > whatever the case may be for that environment) for all soap > > > > > faults defined in the WSDL, so that a client developer could > > > > > "catch" a specific fault (as opposed to, for example, a .NET > > > > > client having to catch a general System.Exception, then > > > > > interrogate it further to find out exactly what went wrong). > > > > > > > > > > All I'm trying to do is simply describe the custom > exceptions my > > > > > service throws in my WSDL, and then test against > various client > > > > > environments to insure my WSDL describes the faults > > > correctly. But > > > > > how do I test this against non-Java clients? Or even > > > Java clients > > > > > for that matter? > > > > > > > > > > Take the Axis samples/faults example. In VB .NET, after > > > retrieving > > > > > the WSDL, does the client have any knowledge at all about > > > > > NoSuchEmployeeFault? It didn't look like it when I tried > > > it. And > > > > > in BEA WebLogic (which generates Java client code), the > > > > > NoSuchEmployeeFault class it generated did not subclass from > > > > > Throwable, even though NoSuchEmployeeFault is described in > > > > > wsdl:fault elements in the WSDL. > > > > > > > > > > Am I expecting too much here? Is there a better way > for me to > > > > > test that my custom faults are described correctly in my WSDL? > > > > > > > > > > Is there anybody who can set this lost soul straight? > > > > > > > > > > Regards. > > > > > > > > > > Steve Pannier > > > > > > > > > > > > > > > > Steve, > > > > > > > > > > > > I have experimented a bit with SOAP faults on .NET > side and > > > > > > server > > > >side > > > > > > exceptions on Axis side. As far as my understanding goes: > > > > > > - You can access the SOAP fault from .NET client. > > > However, that's > > > > > > "SOAP > > > > > fault" > > > > > > view - not the "Exception" view of the server side > > > problem. I have > > > > > > not > > > > > seen > > > > > > SOAP faults being converted to exceptions on the .NET > > > client side. > > > > > > In > > > >our > > > > > > > > > > > prototype, we are just accessing SOAP fault code, > > > string etc. We > > > > > > can > > > > > convert > > > > > > that to appropriate exception but that's application's > > > job not web > > > > > services > > > > > > infrastructure's job (in this case .NET) > > > > > > - I am not sure that a "custom" exception can be caught by > > > > > > non-Java > > > >(even > > > > > > > > > > > non-Axis clients implemented in Java) because there is > > > no standard > > > > > > (and > > > > > hence > > > > > > interoperable) way of communicating that this SOAP > > > fault maps to > > > > > > this > > > > > exception > > > > > > so that client side web services infrastructure can > > > > > > instantiate the > > > > > exception. > > > > > > In fact, you might consume a web service from a programming > > > > > > language > > > > > which does > > > > > > not have any concept of exception. In Axis > > > server-client scenario > > > > > > interoperability is not an issue. Axis client knows > > > where in the > > > > > > SOAP > > > > > fault to > > > > > > look for exception mapping information and as long as > > > client has > > > > > > the > > > > > exception > > > > > > class in the classpath it can instantiate the exception but > > > > > > achieving > > > >the > > > > > same > > > > > > thing in a language independent way is difficult and I > > > don't think > > > > > > web > > > > > services > > > > > > standards address this. Someone please correct me if my > > > > > > understanding > > > >is > > > > > not > > > > > > quite right .. > > > > > > > > > > > > Ajay > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > "Steve Pannier" <[EMAIL PROTECTED]> > > > > > > > > > > > > 09/24/2003 02:54 AM > > > > > > > > > > > > Please respond to > > > > > > [EMAIL PROTECTED] > > > > > > > > > > > > > > > > > > > > > > > > To > > > > > > [EMAIL PROTECTED] > > > > > > cc > > > > > > > > > > > > Subject > > > > > > Soap Fault question > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Axis 1.1 > > > > > > > > > > > > I'm trying to get my web service to throw a > > > > > > custom exception subclassed from RemoteException. > > > > > > So to start off I looked at the code under > samples/faults. I > > > > > > deployed the service, ran the supplied Axis client, > everything > > > > > > looked good. (I had to 1st put a try/catch around the > > > call.invoke > > > > > > in the client to see if catching the NoSuchEmployeeFault > > > > > > exception really works). > > > > > > > > > > > > Now, my goal is to be able to support many > different types of > > > > > > clients (.NET, JWSDP, BEA WebLogic, etc). So I tried > > > JWSDP: After > > > > > > getting the Employee.wsdl file from Axis, I generated > > > the client > > > > > > code. But it wouldn't compile, because the "cause" > property > > > > > > in the generated exception class is defined as > Object instead > > > > > > of Throwable. (Axis did inform me that "The class > > > > > > java.lang.Throwable is defined in a java or javax > package and > > > > > > cannot be converted into an xml schema type. An xml schema > > > > > > anyType will be used to define this class in the > wsdl file", > > > > > > so I knew something was amiss.) > > > > > > > > > > > > OK. So I moved on to VB .NET. I retrieved the WSDL and > > > > > > created my client code. I was able to catch > > > System.Exception, > > > > > > but not a NoSuchEmployeeFault exception. .NET did not > > > create an > > > > > > object to represent the NoSuchEmployeeFault exception. > > > > > > > > > > > > I tried BEA WebLogic also, but it didn't work there > > > either. The > > > > > > NoSuchEmployeeFault class it created does not subclass from > > > > > > Throwable, so it couldn't be used in a "catch" clause. > > > > > > > > > > > > So my questions: > > > > > > > > > > > > - Has anyone else got the samples/faults service > > > > > > code to work correctly against a non-Axis client > > > > > > environment? > > > > > > > > > > > > - Am I correct in assuming that my custom exception can be > > > > > > "caught" by any client, even if non-Java (provided my WSDL > > > > > > describes it correctly)? > > > > > > > > > > > > - In order to have Axis return a Soap Fault, is it a > > > requirement > > > > > > to add *all* the configuration information shown in the > > > > > > samples/faults deploy.wsdd file to my WSDD deployment > > > file? (i.e. > > > > > > Do I need to define all operation elements, even for > > > the methods > > > > > > that don't return a Soap fault?) > > > > > > > > > > > > Any examples would be greatly appreciated. > > > > > > > > > > > > Regards. > > > > > > > > > > > > Steve Pannier > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >