You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-user@axis.apache.org by "John G. Norman" <jo...@7fff.com> on 2007/04/14 17:12:26 UTC

Clients don't get exception thrown out of methods returning void (was: Re: Web service error handling with POJO approach)

After many hours, I finally traced my problem to an apparent bug.

(Workaround for the bug at the end.)

The bug looks a lot like 1277 in Jira, which was a blocker and
resolved for 1.0 (http://issues.apache.org/jira/browse/AXIS2-1277).

Before I add a bug report, I would appreciate it if someone out there
could reproduce what's below as a sanity check. It's about 10 lines
added to one of the samples.

Here's the story:

My POJO-style client wasn't getting exceptions from its POJO-style
service. So I went back to the samples/pojo example, and threw an
exception from a method. The client got it. Hmm. I just couldn't
figure out what the difference was between my code and the sample.
Then I realized that my methods return void.

So I added this to AddressBookService.java in samples/pojo, a method
returning void, then a second returning String:

    public void test1(String s) throws Exception {
	throw new Exception("test1");
    }

    public String test2(String s) throws Exception {
	throw new Exception("test2");
    }

And this to AddressBookADBClient.java:

            Test1 test1 = new Test1();
            test1.setParam0("foo");
            stub.test1(test1);

            Test2 test2 = new Test2();
            test2.setParam0("bar");
            stub.test2(test2);

Here's a snippet from the server-side log:

Apr 14, 2007 10:55:28 AM
org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver
invokeBusinessLogic
SEVERE: test1
java.lang.reflect.InvocationTargetException
Caused by: java.lang.Exception: test1
        at sample.addressbook.service.AddressBookService.test1(Unknown Source)
        ... 35 more
Apr 14, 2007 10:55:29 AM
org.apache.axis2.rpc.receivers.RPCMessageReceiver invokeBusinessLogic
SEVERE: test2
java.lang.reflect.InvocationTargetException
Caused by: java.lang.Exception: test2
        at sample.addressbook.service.AddressBookService.test2(Unknown Source)
        ... 35 more

As you can see, both exceptions are thrown.

Now here's the client (NOTICE: No evidence of an exception from the
test1 method):

adb.client.run:
     [java] Name   :Abby Cadabby
     [java] Street :Sesame Street
     [java] City   :Sesame City
     [java] State  :Sesame State
     [java] Postal Code :11111
     [java] org.apache.axis2.AxisFault: test2
     [java]     at
org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.jav
a:271)
     [java]     at
org.apache.axis2.description.OutInAxisOperationClient.execute(OutInAxisOperation.
java:202)
     [java]     at
sample.addressbook.stub.AddressBookServiceStub.test2(Unknown Source)

So I guess that the workaround is that I'll have to have all of my
methods return something: Perhaps a String, or maybe I'll create a
JavaBean class called Nothing. Or maybe even Void with a capital V.

This is a really awful bug.

On 4/10/07, John G. Norman <jo...@7fff.com> wrote:
> With a POJO Service:
>
> I have now tried the strategy here:
>
> http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/integration/test/org/apache/axis2/engine/util/FaultThrowingService.java?view=markup
>
> Still not seeing the exception on the client that calls the service .
> . . Still getting:
>
> > FaultReason; nested exception is:
> >         java.lang.Exception: This is a test Exception
> > java.lang.reflect.InvocationTargetException
> >         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> >         at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> >         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> >         at java.lang.reflect.Method.invoke(Method.java:324)
> > [much deleted]
> >
> > Caused by: org.apache.axis2.AxisFault: FaultReason; nested exception is:
> >         java.lang.Exception: This is a test Exception
> >         at com.myco.Service.test(Service.java:45)
> >         ... 48 more
> > Caused by: java.lang.Exception: This is a test Exception
> >         ... 49 more
> > DEBUG 16:24:37,843 org.apache.axis2.AxisFault: FaultReason; nested
> > exception is:
> >         java.lang.Exception: This is a test Exception
> > DEBUG 16:24:37,843 isReplyRedirected: FaultTo is null. Returning
> > isReplyRedirected
> > DEBUG 16:24:37,843 isReplyRedirected: ReplyTo is null. Returning false
> >
>
> On 4/9/07, John G. Norman <jo...@7fff.com> wrote:
> > Hi all.
> >
> > This is a great topic -- how to manage exceptions for services built
> > on POJOs. If it is as easy as the link Anne Manes provided
> > (http://wso2.org/library/171) then throwing exceptions might well be
> > included in the main Axis2 docs at
> > http://ws.apache.org/axis2/1_1_1/pojoguide.html).
> >
> > But I just tried throwing an exception out of a POJO's method  (the
> > basis for a service as described here:
> > http://ws.apache.org/axis2/1_1_1/pojoguide.html), and the exception
> > doesn't seem to make it back to the client.
> >
> > Does the QName need to match one of the faults defined in the client stub?
> >
> > In any case, the code looks like this:
> >
> >   public void test() throws AxisFault {
> > throw      new AxisFault(new QName("http://test.org", "FaultCode",
> > "test"), "FaultReason", new Exception("This is a test Exception"));
> >   }
> >
> > On the server, the trace looks like this:
> >
> > FaultReason; nested exception is:
> >         java.lang.Exception: This is a test Exception
> > java.lang.reflect.InvocationTargetException
> >         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> >         at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> >         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> >         at java.lang.reflect.Method.invoke(Method.java:324)
> > [much deleted]
> >
> > Caused by: org.apache.axis2.AxisFault: FaultReason; nested exception is:
> >         java.lang.Exception: This is a test Exception
> >         at com.myco.Service.test(Service.java:45)
> >         ... 48 more
> > Caused by: java.lang.Exception: This is a test Exception
> >         ... 49 more
> > DEBUG 16:24:37,843 org.apache.axis2.AxisFault: FaultReason; nested
> > exception is:
> >         java.lang.Exception: This is a test Exception
> > DEBUG 16:24:37,843 isReplyRedirected: FaultTo is null. Returning
> > isReplyRedirected
> > DEBUG 16:24:37,843 isReplyRedirected: ReplyTo is null. Returning false
> >
> > On 4/3/07, Anne Thomas Manes <at...@gmail.com> wrote:
> > > See http://wso2.org/library/171.
> > >
> > > On 4/3/07, Chan, Herman <He...@inquent.com> wrote:
> > > >
> > > >
> > > >
> > > >
> > > > Hi all:
> > > >
> > > >
> > > >
> > > > I am relatively new to Axis 2 and web services in general, so please bear
> > > > with me if I ask any stupid questions.
> > > >
> > > >
> > > >
> > > > I am writing a very simple web service that would return a list of
> > > > directories on a server.  However, if certain directories does not exists,
> > > > I'd like a throw an error back to the calling client.
> > > >
> > > >
> > > >
> > > > I am using the POJO approach to create web services using axis2, so is it
> > > > good enough for me to throw a plain Exception or do I have to do more?  What
> > > > is the best practice in doing error handling in web services?
> > > >
> > > >
> > > >
> > > > Thanks in advance.
> > > >
> > > >
> > > >
> > > > Herman Chan
> > > >
> > > >
> > >
> > > ---------------------------------------------------------------------
> > > To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
> > > For additional commands, e-mail: axis-user-help@ws.apache.org
> > >
> > >
> >
>

---------------------------------------------------------------------
To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-user-help@ws.apache.org


Re: Clients don't get exception thrown out of methods returning void (was: Re: Web service error handling with POJO approach)

Posted by "John G. Norman" <jo...@7fff.com>.
Thanks, Anne. Here it is:

    https://issues.apache.org/jira/browse/AXIS2-2529

I attached a ZIP of a hacked version of samples/pojo that demonstrates
the problem.

On 4/15/07, Anne Thomas Manes <at...@gmail.com> wrote:
> Please file a JIRA.
>
> On 4/14/07, John G. Norman <jo...@7fff.com> wrote:
> > Martin,
> >
> > *** Throw an exception from the method that returns void.
> >
> > That's what my posting was about: If you throw an exception from a
> > method that returns void, ** the client never gets the exception **.
> > It will be logged on the server-side.
> >
> > If you change the method to return something like String (but, again,
> > throw an exception from within the method), the client does get the
> > exception.
> >
> > John
> >
> > On 4/14/07, Martin Gainty <mg...@hotmail.com> wrote:
> > > Good Afternoon John-
> > >
> > > I just deployed the Axis 2.1.1 original pojo sample of AddressBookService
> > > without any errors
> > >
> > > pojo/build/classes/META-INF/services.xml displays
> > > <service name="AddressBookService" scope="application">
> > >     <description>
> > >         POJO: AddressBook Service
> > >     </description>
> > >     <messageReceivers>
> > >         <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
> > >                          class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
> > >         <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
> > >                          class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
> > >     </messageReceivers>
> > >     <parameter name="ServiceClass"
> > > locked="false">sample.addressbook.service.AddressBookService</parameter>
> > >
> > > </service>
> > >
> > > here is the code for AddressBookService
> > >
> > > package sample.addressbook.service;
> > > public class AddressBookService {
> > >     private HashMap entries = new HashMap();
> > >     /*** Add an Entry to the Address Book
> > >          * @param entry */
> > >     public void addEntry(Entry entry)
> > >    {
> > >         this.entries.put(entry.getName(), entry);
> > >     }
> > >
> > >     /*** Search an address of a person
> > >      * @param name the name of the person whose address needs to be found
> > >      * @return return the address entry of the person.
> > >      */
> > >     public Entry findEntry(String name)
> > >    {
> > >         return (Entry) this.entries.get(name);
> > >     }
> > > }
> > >
> > > !--once the service is deployed I can access the service attributes via
> > > !--http://localhost:8080/axis2-/axis2-admin/listService
> > > !--which displays
> > >
> > > Service Description: AddressBookService
> > > Service Status : Active
> > > Engaged modules for the service
> > >   a.. addressing-1.1 :: Disengage
> > >
> > >   Available operations
> > >   b.. addEntry
> > >   Engaged Modules for the Operation
> > >     a.. addressing-1.1 :: Disengage
> > >
> > >   c.. findEntry
> > >   Engaged Modules for the Operation
> > >     a.. addressing-1.1 :: Disengage
> > >
> > >
> > > I'm attempting to understand why you had to change the signatures when
> > > services.xml already declares
> > > org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver (addEntry method)
> > > org.apache.axis2.rpc.receivers.RPCMessageReceiver (findEntry method)
> > >
> > > ???
> > > Martin
> > >
> > > This email message and any files transmitted with it contain confidential
> > > information intended only for the person(s) to whom this email message is
> > > addressed.  If you have received this email message in error, please notify
> > > the sender immediately by telephone or email and destroy the original
> > > message without making a copy.  Thank you.
> > >
> > > ----- Original Message -----
> > > From: "John G. Norman" <jo...@7fff.com>
> > > To: <ax...@ws.apache.org>
> > > Sent: Saturday, April 14, 2007 11:12 AM
> > > Subject: Clients don't get exception thrown out of methods returning void
> > > (was: Re: Web service error handling with POJO approach)
> > >
> > >
> > > > After many hours, I finally traced my problem to an apparent bug.
> > > >
> > > > (Workaround for the bug at the end.)
> > > >
> > > > The bug looks a lot like 1277 in Jira, which was a blocker and
> > > > resolved for 1.0 (http://issues.apache.org/jira/browse/AXIS2-1277).
> > > >
> > > > Before I add a bug report, I would appreciate it if someone out there
> > > > could reproduce what's below as a sanity check. It's about 10 lines
> > > > added to one of the samples.
> > > >
> > > > Here's the story:
> > > >
> > > > My POJO-style client wasn't getting exceptions from its POJO-style
> > > > service. So I went back to the samples/pojo example, and threw an
> > > > exception from a method. The client got it. Hmm. I just couldn't
> > > > figure out what the difference was between my code and the sample.
> > > > Then I realized that my methods return void.
> > > >
> > > > So I added this to AddressBookService.java in samples/pojo, a method
> > > > returning void, then a second returning String:
> > > >
> > > >    public void test1(String s) throws Exception {
> > > > throw new Exception("test1");
> > > >    }
> > > >
> > > >    public String test2(String s) throws Exception {
> > > > throw new Exception("test2");
> > > >    }
> > > >
> > > > And this to AddressBookADBClient.java:
> > > >
> > > >            Test1 test1 = new Test1();
> > > >            test1.setParam0("foo");
> > > >            stub.test1(test1);
> > > >
> > > >            Test2 test2 = new Test2();
> > > >            test2.setParam0("bar");
> > > >            stub.test2(test2);
> > > >
> > > > Here's a snippet from the server-side log:
> > > >
> > > > Apr 14, 2007 10:55:28 AM
> > > > org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver
> > > > invokeBusinessLogic
> > > > SEVERE: test1
> > > > java.lang.reflect.InvocationTargetException
> > > > Caused by: java.lang.Exception: test1
> > > >        at sample.addressbook.service.AddressBookService.test1(Unknown
> > > > Source)
> > > >        ... 35 more
> > > > Apr 14, 2007 10:55:29 AM
> > > > org.apache.axis2.rpc.receivers.RPCMessageReceiver invokeBusinessLogic
> > > > SEVERE: test2
> > > > java.lang.reflect.InvocationTargetException
> > > > Caused by: java.lang.Exception: test2
> > > >        at sample.addressbook.service.AddressBookService.test2(Unknown
> > > > Source)
> > > >        ... 35 more
> > > >
> > > > As you can see, both exceptions are thrown.
> > > >
> > > > Now here's the client (NOTICE: No evidence of an exception from the
> > > > test1 method):
> > > >
> > > > adb.client.run:
> > > >     [java] Name   :Abby Cadabby
> > > >     [java] Street :Sesame Street
> > > >     [java] City   :Sesame City
> > > >     [java] State  :Sesame State
> > > >     [java] Postal Code :11111
> > > >     [java] org.apache.axis2.AxisFault: test2
> > > >     [java]     at
> > > > org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.jav
> > > > a:271)
> > > >     [java]     at
> > > > org.apache.axis2.description.OutInAxisOperationClient.execute(OutInAxisOperation.
> > > > java:202)
> > > >     [java]     at
> > > > sample.addressbook.stub.AddressBookServiceStub.test2(Unknown Source)
> > > >
> > > > So I guess that the workaround is that I'll have to have all of my
> > > > methods return something: Perhaps a String, or maybe I'll create a
> > > > JavaBean class called Nothing. Or maybe even Void with a capital V.
> > > >
> > > > This is a really awful bug.
> > > >
> > > > On 4/10/07, John G. Norman <jo...@7fff.com> wrote:
> > > >> With a POJO Service:
> > > >>
> > > >> I have now tried the strategy here:
> > > >>
> > > >> http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/integration/test/org/apache/axis2/engine/util/FaultThrowingService.java?view=markup
> > > >>
> > > >> Still not seeing the exception on the client that calls the service .
> > > >> . . Still getting:
> > > >>
> > > >> > FaultReason; nested exception is:
> > > >> >         java.lang.Exception: This is a test Exception
> > > >> > java.lang.reflect.InvocationTargetException
> > > >> >         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> > > >> >         at
> > > >> > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> > > >> >         at
> > > >> > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> > > >> >         at java.lang.reflect.Method.invoke(Method.java:324)
> > > >> > [much deleted]
> > > >> >
> > > >> > Caused by: org.apache.axis2.AxisFault: FaultReason; nested exception
> > > >> > is:
> > > >> >         java.lang.Exception: This is a test Exception
> > > >> >         at com.myco.Service.test(Service.java:45)
> > > >> >         ... 48 more
> > > >> > Caused by: java.lang.Exception: This is a test Exception
> > > >> >         ... 49 more
> > > >> > DEBUG 16:24:37,843 org.apache.axis2.AxisFault: FaultReason; nested
> > > >> > exception is:
> > > >> >         java.lang.Exception: This is a test Exception
> > > >> > DEBUG 16:24:37,843 isReplyRedirected: FaultTo is null. Returning
> > > >> > isReplyRedirected
> > > >> > DEBUG 16:24:37,843 isReplyRedirected: ReplyTo is null. Returning false
> > > >> >
> > > >>
> > > >> On 4/9/07, John G. Norman <jo...@7fff.com> wrote:
> > > >> > Hi all.
> > > >> >
> > > >> > This is a great topic -- how to manage exceptions for services built
> > > >> > on POJOs. If it is as easy as the link Anne Manes provided
> > > >> > (http://wso2.org/library/171) then throwing exceptions might well be
> > > >> > included in the main Axis2 docs at
> > > >> > http://ws.apache.org/axis2/1_1_1/pojoguide.html).
> > > >> >
> > > >> > But I just tried throwing an exception out of a POJO's method  (the
> > > >> > basis for a service as described here:
> > > >> > http://ws.apache.org/axis2/1_1_1/pojoguide.html), and the exception
> > > >> > doesn't seem to make it back to the client.
> > > >> >
> > > >> > Does the QName need to match one of the faults defined in the client
> > > >> > stub?
> > > >> >
> > > >> > In any case, the code looks like this:
> > > >> >
> > > >> >   public void test() throws AxisFault {
> > > >> > throw      new AxisFault(new QName("http://test.org", "FaultCode",
> > > >> > "test"), "FaultReason", new Exception("This is a test Exception"));
> > > >> >   }
> > > >> >
> > > >> > On the server, the trace looks like this:
> > > >> >
> > > >> > FaultReason; nested exception is:
> > > >> >         java.lang.Exception: This is a test Exception
> > > >> > java.lang.reflect.InvocationTargetException
> > > >> >         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> > > >> >         at
> > > >> > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> > > >> >         at
> > > >> > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> > > >> >         at java.lang.reflect.Method.invoke(Method.java:324)
> > > >> > [much deleted]
> > > >> >
> > > >> > Caused by: org.apache.axis2.AxisFault: FaultReason; nested exception
> > > >> > is:
> > > >> >         java.lang.Exception: This is a test Exception
> > > >> >         at com.myco.Service.test(Service.java:45)
> > > >> >         ... 48 more
> > > >> > Caused by: java.lang.Exception: This is a test Exception
> > > >> >         ... 49 more
> > > >> > DEBUG 16:24:37,843 org.apache.axis2.AxisFault: FaultReason; nested
> > > >> > exception is:
> > > >> >         java.lang.Exception: This is a test Exception
> > > >> > DEBUG 16:24:37,843 isReplyRedirected: FaultTo is null. Returning
> > > >> > isReplyRedirected
> > > >> > DEBUG 16:24:37,843 isReplyRedirected: ReplyTo is null. Returning false
> > > >> >
> > > >> > On 4/3/07, Anne Thomas Manes <at...@gmail.com> wrote:
> > > >> > > See http://wso2.org/library/171.
> > > >> > >
> > > >> > > On 4/3/07, Chan, Herman <He...@inquent.com> wrote:
> > > >> > > >
> > > >> > > >
> > > >> > > >
> > > >> > > >
> > > >> > > > Hi all:
> > > >> > > >
> > > >> > > >
> > > >> > > >
> > > >> > > > I am relatively new to Axis 2 and web services in general, so
> > > >> > > > please bear
> > > >> > > > with me if I ask any stupid questions.
> > > >> > > >
> > > >> > > >
> > > >> > > >
> > > >> > > > I am writing a very simple web service that would return a list of
> > > >> > > > directories on a server.  However, if certain directories does not
> > > >> > > > exists,
> > > >> > > > I'd like a throw an error back to the calling client.
> > > >> > > >
> > > >> > > >
> > > >> > > >
> > > >> > > > I am using the POJO approach to create web services using axis2, so
> > > >> > > > is it
> > > >> > > > good enough for me to throw a plain Exception or do I have to do
> > > >> > > > more?  What
> > > >> > > > is the best practice in doing error handling in web services?
> > > >> > > >
> > > >> > > >
> > > >> > > >
> > > >> > > > Thanks in advance.
> > > >> > > >
> > > >> > > >
> > > >> > > >
> > > >> > > > Herman Chan
> > > >> > > >
> > > >> > > >
> > > >> > >
> > > >> > > ---------------------------------------------------------------------
> > > >> > > To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
> > > >> > > For additional commands, e-mail: axis-user-help@ws.apache.org
> > > >> > >
> > > >> > >
> > > >> >
> > > >>
> > > >
> > > > ---------------------------------------------------------------------
> > > > To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
> > > > For additional commands, e-mail: axis-user-help@ws.apache.org
> > > >
> > > >
> > >
> > >
> > > ---------------------------------------------------------------------
> > > To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
> > > For additional commands, e-mail: axis-user-help@ws.apache.org
> > >
> > >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
> > For additional commands, e-mail: axis-user-help@ws.apache.org
> >
> >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
> For additional commands, e-mail: axis-user-help@ws.apache.org
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-user-help@ws.apache.org


Re: Clients don't get exception thrown out of methods returning void (was: Re: Web service error handling with POJO approach)

Posted by Anne Thomas Manes <at...@gmail.com>.
Please file a JIRA.

On 4/14/07, John G. Norman <jo...@7fff.com> wrote:
> Martin,
>
> *** Throw an exception from the method that returns void.
>
> That's what my posting was about: If you throw an exception from a
> method that returns void, ** the client never gets the exception **.
> It will be logged on the server-side.
>
> If you change the method to return something like String (but, again,
> throw an exception from within the method), the client does get the
> exception.
>
> John
>
> On 4/14/07, Martin Gainty <mg...@hotmail.com> wrote:
> > Good Afternoon John-
> >
> > I just deployed the Axis 2.1.1 original pojo sample of AddressBookService
> > without any errors
> >
> > pojo/build/classes/META-INF/services.xml displays
> > <service name="AddressBookService" scope="application">
> >     <description>
> >         POJO: AddressBook Service
> >     </description>
> >     <messageReceivers>
> >         <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
> >                          class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
> >         <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
> >                          class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
> >     </messageReceivers>
> >     <parameter name="ServiceClass"
> > locked="false">sample.addressbook.service.AddressBookService</parameter>
> >
> > </service>
> >
> > here is the code for AddressBookService
> >
> > package sample.addressbook.service;
> > public class AddressBookService {
> >     private HashMap entries = new HashMap();
> >     /*** Add an Entry to the Address Book
> >          * @param entry */
> >     public void addEntry(Entry entry)
> >    {
> >         this.entries.put(entry.getName(), entry);
> >     }
> >
> >     /*** Search an address of a person
> >      * @param name the name of the person whose address needs to be found
> >      * @return return the address entry of the person.
> >      */
> >     public Entry findEntry(String name)
> >    {
> >         return (Entry) this.entries.get(name);
> >     }
> > }
> >
> > !--once the service is deployed I can access the service attributes via
> > !--http://localhost:8080/axis2-/axis2-admin/listService
> > !--which displays
> >
> > Service Description: AddressBookService
> > Service Status : Active
> > Engaged modules for the service
> >   a.. addressing-1.1 :: Disengage
> >
> >   Available operations
> >   b.. addEntry
> >   Engaged Modules for the Operation
> >     a.. addressing-1.1 :: Disengage
> >
> >   c.. findEntry
> >   Engaged Modules for the Operation
> >     a.. addressing-1.1 :: Disengage
> >
> >
> > I'm attempting to understand why you had to change the signatures when
> > services.xml already declares
> > org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver (addEntry method)
> > org.apache.axis2.rpc.receivers.RPCMessageReceiver (findEntry method)
> >
> > ???
> > Martin
> >
> > This email message and any files transmitted with it contain confidential
> > information intended only for the person(s) to whom this email message is
> > addressed.  If you have received this email message in error, please notify
> > the sender immediately by telephone or email and destroy the original
> > message without making a copy.  Thank you.
> >
> > ----- Original Message -----
> > From: "John G. Norman" <jo...@7fff.com>
> > To: <ax...@ws.apache.org>
> > Sent: Saturday, April 14, 2007 11:12 AM
> > Subject: Clients don't get exception thrown out of methods returning void
> > (was: Re: Web service error handling with POJO approach)
> >
> >
> > > After many hours, I finally traced my problem to an apparent bug.
> > >
> > > (Workaround for the bug at the end.)
> > >
> > > The bug looks a lot like 1277 in Jira, which was a blocker and
> > > resolved for 1.0 (http://issues.apache.org/jira/browse/AXIS2-1277).
> > >
> > > Before I add a bug report, I would appreciate it if someone out there
> > > could reproduce what's below as a sanity check. It's about 10 lines
> > > added to one of the samples.
> > >
> > > Here's the story:
> > >
> > > My POJO-style client wasn't getting exceptions from its POJO-style
> > > service. So I went back to the samples/pojo example, and threw an
> > > exception from a method. The client got it. Hmm. I just couldn't
> > > figure out what the difference was between my code and the sample.
> > > Then I realized that my methods return void.
> > >
> > > So I added this to AddressBookService.java in samples/pojo, a method
> > > returning void, then a second returning String:
> > >
> > >    public void test1(String s) throws Exception {
> > > throw new Exception("test1");
> > >    }
> > >
> > >    public String test2(String s) throws Exception {
> > > throw new Exception("test2");
> > >    }
> > >
> > > And this to AddressBookADBClient.java:
> > >
> > >            Test1 test1 = new Test1();
> > >            test1.setParam0("foo");
> > >            stub.test1(test1);
> > >
> > >            Test2 test2 = new Test2();
> > >            test2.setParam0("bar");
> > >            stub.test2(test2);
> > >
> > > Here's a snippet from the server-side log:
> > >
> > > Apr 14, 2007 10:55:28 AM
> > > org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver
> > > invokeBusinessLogic
> > > SEVERE: test1
> > > java.lang.reflect.InvocationTargetException
> > > Caused by: java.lang.Exception: test1
> > >        at sample.addressbook.service.AddressBookService.test1(Unknown
> > > Source)
> > >        ... 35 more
> > > Apr 14, 2007 10:55:29 AM
> > > org.apache.axis2.rpc.receivers.RPCMessageReceiver invokeBusinessLogic
> > > SEVERE: test2
> > > java.lang.reflect.InvocationTargetException
> > > Caused by: java.lang.Exception: test2
> > >        at sample.addressbook.service.AddressBookService.test2(Unknown
> > > Source)
> > >        ... 35 more
> > >
> > > As you can see, both exceptions are thrown.
> > >
> > > Now here's the client (NOTICE: No evidence of an exception from the
> > > test1 method):
> > >
> > > adb.client.run:
> > >     [java] Name   :Abby Cadabby
> > >     [java] Street :Sesame Street
> > >     [java] City   :Sesame City
> > >     [java] State  :Sesame State
> > >     [java] Postal Code :11111
> > >     [java] org.apache.axis2.AxisFault: test2
> > >     [java]     at
> > > org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.jav
> > > a:271)
> > >     [java]     at
> > > org.apache.axis2.description.OutInAxisOperationClient.execute(OutInAxisOperation.
> > > java:202)
> > >     [java]     at
> > > sample.addressbook.stub.AddressBookServiceStub.test2(Unknown Source)
> > >
> > > So I guess that the workaround is that I'll have to have all of my
> > > methods return something: Perhaps a String, or maybe I'll create a
> > > JavaBean class called Nothing. Or maybe even Void with a capital V.
> > >
> > > This is a really awful bug.
> > >
> > > On 4/10/07, John G. Norman <jo...@7fff.com> wrote:
> > >> With a POJO Service:
> > >>
> > >> I have now tried the strategy here:
> > >>
> > >> http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/integration/test/org/apache/axis2/engine/util/FaultThrowingService.java?view=markup
> > >>
> > >> Still not seeing the exception on the client that calls the service .
> > >> . . Still getting:
> > >>
> > >> > FaultReason; nested exception is:
> > >> >         java.lang.Exception: This is a test Exception
> > >> > java.lang.reflect.InvocationTargetException
> > >> >         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> > >> >         at
> > >> > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> > >> >         at
> > >> > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> > >> >         at java.lang.reflect.Method.invoke(Method.java:324)
> > >> > [much deleted]
> > >> >
> > >> > Caused by: org.apache.axis2.AxisFault: FaultReason; nested exception
> > >> > is:
> > >> >         java.lang.Exception: This is a test Exception
> > >> >         at com.myco.Service.test(Service.java:45)
> > >> >         ... 48 more
> > >> > Caused by: java.lang.Exception: This is a test Exception
> > >> >         ... 49 more
> > >> > DEBUG 16:24:37,843 org.apache.axis2.AxisFault: FaultReason; nested
> > >> > exception is:
> > >> >         java.lang.Exception: This is a test Exception
> > >> > DEBUG 16:24:37,843 isReplyRedirected: FaultTo is null. Returning
> > >> > isReplyRedirected
> > >> > DEBUG 16:24:37,843 isReplyRedirected: ReplyTo is null. Returning false
> > >> >
> > >>
> > >> On 4/9/07, John G. Norman <jo...@7fff.com> wrote:
> > >> > Hi all.
> > >> >
> > >> > This is a great topic -- how to manage exceptions for services built
> > >> > on POJOs. If it is as easy as the link Anne Manes provided
> > >> > (http://wso2.org/library/171) then throwing exceptions might well be
> > >> > included in the main Axis2 docs at
> > >> > http://ws.apache.org/axis2/1_1_1/pojoguide.html).
> > >> >
> > >> > But I just tried throwing an exception out of a POJO's method  (the
> > >> > basis for a service as described here:
> > >> > http://ws.apache.org/axis2/1_1_1/pojoguide.html), and the exception
> > >> > doesn't seem to make it back to the client.
> > >> >
> > >> > Does the QName need to match one of the faults defined in the client
> > >> > stub?
> > >> >
> > >> > In any case, the code looks like this:
> > >> >
> > >> >   public void test() throws AxisFault {
> > >> > throw      new AxisFault(new QName("http://test.org", "FaultCode",
> > >> > "test"), "FaultReason", new Exception("This is a test Exception"));
> > >> >   }
> > >> >
> > >> > On the server, the trace looks like this:
> > >> >
> > >> > FaultReason; nested exception is:
> > >> >         java.lang.Exception: This is a test Exception
> > >> > java.lang.reflect.InvocationTargetException
> > >> >         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> > >> >         at
> > >> > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> > >> >         at
> > >> > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> > >> >         at java.lang.reflect.Method.invoke(Method.java:324)
> > >> > [much deleted]
> > >> >
> > >> > Caused by: org.apache.axis2.AxisFault: FaultReason; nested exception
> > >> > is:
> > >> >         java.lang.Exception: This is a test Exception
> > >> >         at com.myco.Service.test(Service.java:45)
> > >> >         ... 48 more
> > >> > Caused by: java.lang.Exception: This is a test Exception
> > >> >         ... 49 more
> > >> > DEBUG 16:24:37,843 org.apache.axis2.AxisFault: FaultReason; nested
> > >> > exception is:
> > >> >         java.lang.Exception: This is a test Exception
> > >> > DEBUG 16:24:37,843 isReplyRedirected: FaultTo is null. Returning
> > >> > isReplyRedirected
> > >> > DEBUG 16:24:37,843 isReplyRedirected: ReplyTo is null. Returning false
> > >> >
> > >> > On 4/3/07, Anne Thomas Manes <at...@gmail.com> wrote:
> > >> > > See http://wso2.org/library/171.
> > >> > >
> > >> > > On 4/3/07, Chan, Herman <He...@inquent.com> wrote:
> > >> > > >
> > >> > > >
> > >> > > >
> > >> > > >
> > >> > > > Hi all:
> > >> > > >
> > >> > > >
> > >> > > >
> > >> > > > I am relatively new to Axis 2 and web services in general, so
> > >> > > > please bear
> > >> > > > with me if I ask any stupid questions.
> > >> > > >
> > >> > > >
> > >> > > >
> > >> > > > I am writing a very simple web service that would return a list of
> > >> > > > directories on a server.  However, if certain directories does not
> > >> > > > exists,
> > >> > > > I'd like a throw an error back to the calling client.
> > >> > > >
> > >> > > >
> > >> > > >
> > >> > > > I am using the POJO approach to create web services using axis2, so
> > >> > > > is it
> > >> > > > good enough for me to throw a plain Exception or do I have to do
> > >> > > > more?  What
> > >> > > > is the best practice in doing error handling in web services?
> > >> > > >
> > >> > > >
> > >> > > >
> > >> > > > Thanks in advance.
> > >> > > >
> > >> > > >
> > >> > > >
> > >> > > > Herman Chan
> > >> > > >
> > >> > > >
> > >> > >
> > >> > > ---------------------------------------------------------------------
> > >> > > To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
> > >> > > For additional commands, e-mail: axis-user-help@ws.apache.org
> > >> > >
> > >> > >
> > >> >
> > >>
> > >
> > > ---------------------------------------------------------------------
> > > To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
> > > For additional commands, e-mail: axis-user-help@ws.apache.org
> > >
> > >
> >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
> > For additional commands, e-mail: axis-user-help@ws.apache.org
> >
> >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
> For additional commands, e-mail: axis-user-help@ws.apache.org
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-user-help@ws.apache.org


Re: Clients don't get exception thrown out of methods returning void (was: Re: Web service error handling with POJO approach)

Posted by "John G. Norman" <jo...@7fff.com>.
Martin,

*** Throw an exception from the method that returns void.

That's what my posting was about: If you throw an exception from a
method that returns void, ** the client never gets the exception **.
It will be logged on the server-side.

If you change the method to return something like String (but, again,
throw an exception from within the method), the client does get the
exception.

John

On 4/14/07, Martin Gainty <mg...@hotmail.com> wrote:
> Good Afternoon John-
>
> I just deployed the Axis 2.1.1 original pojo sample of AddressBookService
> without any errors
>
> pojo/build/classes/META-INF/services.xml displays
> <service name="AddressBookService" scope="application">
>     <description>
>         POJO: AddressBook Service
>     </description>
>     <messageReceivers>
>         <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
>                          class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
>         <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
>                          class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
>     </messageReceivers>
>     <parameter name="ServiceClass"
> locked="false">sample.addressbook.service.AddressBookService</parameter>
>
> </service>
>
> here is the code for AddressBookService
>
> package sample.addressbook.service;
> public class AddressBookService {
>     private HashMap entries = new HashMap();
>     /*** Add an Entry to the Address Book
>          * @param entry */
>     public void addEntry(Entry entry)
>    {
>         this.entries.put(entry.getName(), entry);
>     }
>
>     /*** Search an address of a person
>      * @param name the name of the person whose address needs to be found
>      * @return return the address entry of the person.
>      */
>     public Entry findEntry(String name)
>    {
>         return (Entry) this.entries.get(name);
>     }
> }
>
> !--once the service is deployed I can access the service attributes via
> !--http://localhost:8080/axis2-/axis2-admin/listService
> !--which displays
>
> Service Description: AddressBookService
> Service Status : Active
> Engaged modules for the service
>   a.. addressing-1.1 :: Disengage
>
>   Available operations
>   b.. addEntry
>   Engaged Modules for the Operation
>     a.. addressing-1.1 :: Disengage
>
>   c.. findEntry
>   Engaged Modules for the Operation
>     a.. addressing-1.1 :: Disengage
>
>
> I'm attempting to understand why you had to change the signatures when
> services.xml already declares
> org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver (addEntry method)
> org.apache.axis2.rpc.receivers.RPCMessageReceiver (findEntry method)
>
> ???
> Martin
>
> This email message and any files transmitted with it contain confidential
> information intended only for the person(s) to whom this email message is
> addressed.  If you have received this email message in error, please notify
> the sender immediately by telephone or email and destroy the original
> message without making a copy.  Thank you.
>
> ----- Original Message -----
> From: "John G. Norman" <jo...@7fff.com>
> To: <ax...@ws.apache.org>
> Sent: Saturday, April 14, 2007 11:12 AM
> Subject: Clients don't get exception thrown out of methods returning void
> (was: Re: Web service error handling with POJO approach)
>
>
> > After many hours, I finally traced my problem to an apparent bug.
> >
> > (Workaround for the bug at the end.)
> >
> > The bug looks a lot like 1277 in Jira, which was a blocker and
> > resolved for 1.0 (http://issues.apache.org/jira/browse/AXIS2-1277).
> >
> > Before I add a bug report, I would appreciate it if someone out there
> > could reproduce what's below as a sanity check. It's about 10 lines
> > added to one of the samples.
> >
> > Here's the story:
> >
> > My POJO-style client wasn't getting exceptions from its POJO-style
> > service. So I went back to the samples/pojo example, and threw an
> > exception from a method. The client got it. Hmm. I just couldn't
> > figure out what the difference was between my code and the sample.
> > Then I realized that my methods return void.
> >
> > So I added this to AddressBookService.java in samples/pojo, a method
> > returning void, then a second returning String:
> >
> >    public void test1(String s) throws Exception {
> > throw new Exception("test1");
> >    }
> >
> >    public String test2(String s) throws Exception {
> > throw new Exception("test2");
> >    }
> >
> > And this to AddressBookADBClient.java:
> >
> >            Test1 test1 = new Test1();
> >            test1.setParam0("foo");
> >            stub.test1(test1);
> >
> >            Test2 test2 = new Test2();
> >            test2.setParam0("bar");
> >            stub.test2(test2);
> >
> > Here's a snippet from the server-side log:
> >
> > Apr 14, 2007 10:55:28 AM
> > org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver
> > invokeBusinessLogic
> > SEVERE: test1
> > java.lang.reflect.InvocationTargetException
> > Caused by: java.lang.Exception: test1
> >        at sample.addressbook.service.AddressBookService.test1(Unknown
> > Source)
> >        ... 35 more
> > Apr 14, 2007 10:55:29 AM
> > org.apache.axis2.rpc.receivers.RPCMessageReceiver invokeBusinessLogic
> > SEVERE: test2
> > java.lang.reflect.InvocationTargetException
> > Caused by: java.lang.Exception: test2
> >        at sample.addressbook.service.AddressBookService.test2(Unknown
> > Source)
> >        ... 35 more
> >
> > As you can see, both exceptions are thrown.
> >
> > Now here's the client (NOTICE: No evidence of an exception from the
> > test1 method):
> >
> > adb.client.run:
> >     [java] Name   :Abby Cadabby
> >     [java] Street :Sesame Street
> >     [java] City   :Sesame City
> >     [java] State  :Sesame State
> >     [java] Postal Code :11111
> >     [java] org.apache.axis2.AxisFault: test2
> >     [java]     at
> > org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.jav
> > a:271)
> >     [java]     at
> > org.apache.axis2.description.OutInAxisOperationClient.execute(OutInAxisOperation.
> > java:202)
> >     [java]     at
> > sample.addressbook.stub.AddressBookServiceStub.test2(Unknown Source)
> >
> > So I guess that the workaround is that I'll have to have all of my
> > methods return something: Perhaps a String, or maybe I'll create a
> > JavaBean class called Nothing. Or maybe even Void with a capital V.
> >
> > This is a really awful bug.
> >
> > On 4/10/07, John G. Norman <jo...@7fff.com> wrote:
> >> With a POJO Service:
> >>
> >> I have now tried the strategy here:
> >>
> >> http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/integration/test/org/apache/axis2/engine/util/FaultThrowingService.java?view=markup
> >>
> >> Still not seeing the exception on the client that calls the service .
> >> . . Still getting:
> >>
> >> > FaultReason; nested exception is:
> >> >         java.lang.Exception: This is a test Exception
> >> > java.lang.reflect.InvocationTargetException
> >> >         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> >> >         at
> >> > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> >> >         at
> >> > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> >> >         at java.lang.reflect.Method.invoke(Method.java:324)
> >> > [much deleted]
> >> >
> >> > Caused by: org.apache.axis2.AxisFault: FaultReason; nested exception
> >> > is:
> >> >         java.lang.Exception: This is a test Exception
> >> >         at com.myco.Service.test(Service.java:45)
> >> >         ... 48 more
> >> > Caused by: java.lang.Exception: This is a test Exception
> >> >         ... 49 more
> >> > DEBUG 16:24:37,843 org.apache.axis2.AxisFault: FaultReason; nested
> >> > exception is:
> >> >         java.lang.Exception: This is a test Exception
> >> > DEBUG 16:24:37,843 isReplyRedirected: FaultTo is null. Returning
> >> > isReplyRedirected
> >> > DEBUG 16:24:37,843 isReplyRedirected: ReplyTo is null. Returning false
> >> >
> >>
> >> On 4/9/07, John G. Norman <jo...@7fff.com> wrote:
> >> > Hi all.
> >> >
> >> > This is a great topic -- how to manage exceptions for services built
> >> > on POJOs. If it is as easy as the link Anne Manes provided
> >> > (http://wso2.org/library/171) then throwing exceptions might well be
> >> > included in the main Axis2 docs at
> >> > http://ws.apache.org/axis2/1_1_1/pojoguide.html).
> >> >
> >> > But I just tried throwing an exception out of a POJO's method  (the
> >> > basis for a service as described here:
> >> > http://ws.apache.org/axis2/1_1_1/pojoguide.html), and the exception
> >> > doesn't seem to make it back to the client.
> >> >
> >> > Does the QName need to match one of the faults defined in the client
> >> > stub?
> >> >
> >> > In any case, the code looks like this:
> >> >
> >> >   public void test() throws AxisFault {
> >> > throw      new AxisFault(new QName("http://test.org", "FaultCode",
> >> > "test"), "FaultReason", new Exception("This is a test Exception"));
> >> >   }
> >> >
> >> > On the server, the trace looks like this:
> >> >
> >> > FaultReason; nested exception is:
> >> >         java.lang.Exception: This is a test Exception
> >> > java.lang.reflect.InvocationTargetException
> >> >         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> >> >         at
> >> > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> >> >         at
> >> > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> >> >         at java.lang.reflect.Method.invoke(Method.java:324)
> >> > [much deleted]
> >> >
> >> > Caused by: org.apache.axis2.AxisFault: FaultReason; nested exception
> >> > is:
> >> >         java.lang.Exception: This is a test Exception
> >> >         at com.myco.Service.test(Service.java:45)
> >> >         ... 48 more
> >> > Caused by: java.lang.Exception: This is a test Exception
> >> >         ... 49 more
> >> > DEBUG 16:24:37,843 org.apache.axis2.AxisFault: FaultReason; nested
> >> > exception is:
> >> >         java.lang.Exception: This is a test Exception
> >> > DEBUG 16:24:37,843 isReplyRedirected: FaultTo is null. Returning
> >> > isReplyRedirected
> >> > DEBUG 16:24:37,843 isReplyRedirected: ReplyTo is null. Returning false
> >> >
> >> > On 4/3/07, Anne Thomas Manes <at...@gmail.com> wrote:
> >> > > See http://wso2.org/library/171.
> >> > >
> >> > > On 4/3/07, Chan, Herman <He...@inquent.com> wrote:
> >> > > >
> >> > > >
> >> > > >
> >> > > >
> >> > > > Hi all:
> >> > > >
> >> > > >
> >> > > >
> >> > > > I am relatively new to Axis 2 and web services in general, so
> >> > > > please bear
> >> > > > with me if I ask any stupid questions.
> >> > > >
> >> > > >
> >> > > >
> >> > > > I am writing a very simple web service that would return a list of
> >> > > > directories on a server.  However, if certain directories does not
> >> > > > exists,
> >> > > > I'd like a throw an error back to the calling client.
> >> > > >
> >> > > >
> >> > > >
> >> > > > I am using the POJO approach to create web services using axis2, so
> >> > > > is it
> >> > > > good enough for me to throw a plain Exception or do I have to do
> >> > > > more?  What
> >> > > > is the best practice in doing error handling in web services?
> >> > > >
> >> > > >
> >> > > >
> >> > > > Thanks in advance.
> >> > > >
> >> > > >
> >> > > >
> >> > > > Herman Chan
> >> > > >
> >> > > >
> >> > >
> >> > > ---------------------------------------------------------------------
> >> > > To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
> >> > > For additional commands, e-mail: axis-user-help@ws.apache.org
> >> > >
> >> > >
> >> >
> >>
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
> > For additional commands, e-mail: axis-user-help@ws.apache.org
> >
> >
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
> For additional commands, e-mail: axis-user-help@ws.apache.org
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-user-help@ws.apache.org


Re: Clients don't get exception thrown out of methods returning void (was: Re: Web service error handling with POJO approach)

Posted by Martin Gainty <mg...@hotmail.com>.
Good Afternoon John-

I just deployed the Axis 2.1.1 original pojo sample of AddressBookService 
without any errors

pojo/build/classes/META-INF/services.xml displays
<service name="AddressBookService" scope="application">
    <description>
        POJO: AddressBook Service
    </description>
    <messageReceivers>
        <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
                         class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
        <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
                         class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
    </messageReceivers>
    <parameter name="ServiceClass" 
locked="false">sample.addressbook.service.AddressBookService</parameter>

</service>

here is the code for AddressBookService

package sample.addressbook.service;
public class AddressBookService {
    private HashMap entries = new HashMap();
    /*** Add an Entry to the Address Book
         * @param entry */
    public void addEntry(Entry entry)
   {
        this.entries.put(entry.getName(), entry);
    }

    /*** Search an address of a person
     * @param name the name of the person whose address needs to be found
     * @return return the address entry of the person.
     */
    public Entry findEntry(String name)
   {
        return (Entry) this.entries.get(name);
    }
}

!--once the service is deployed I can access the service attributes via
!--http://localhost:8080/axis2-/axis2-admin/listService
!--which displays

Service Description: AddressBookService
Service Status : Active
Engaged modules for the service
  a.. addressing-1.1 :: Disengage

  Available operations
  b.. addEntry
  Engaged Modules for the Operation
    a.. addressing-1.1 :: Disengage

  c.. findEntry
  Engaged Modules for the Operation
    a.. addressing-1.1 :: Disengage


I'm attempting to understand why you had to change the signatures when 
services.xml already declares
org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver (addEntry method)
org.apache.axis2.rpc.receivers.RPCMessageReceiver (findEntry method)

???
Martin

This email message and any files transmitted with it contain confidential
information intended only for the person(s) to whom this email message is
addressed.  If you have received this email message in error, please notify
the sender immediately by telephone or email and destroy the original
message without making a copy.  Thank you.

----- Original Message ----- 
From: "John G. Norman" <jo...@7fff.com>
To: <ax...@ws.apache.org>
Sent: Saturday, April 14, 2007 11:12 AM
Subject: Clients don't get exception thrown out of methods returning void 
(was: Re: Web service error handling with POJO approach)


> After many hours, I finally traced my problem to an apparent bug.
>
> (Workaround for the bug at the end.)
>
> The bug looks a lot like 1277 in Jira, which was a blocker and
> resolved for 1.0 (http://issues.apache.org/jira/browse/AXIS2-1277).
>
> Before I add a bug report, I would appreciate it if someone out there
> could reproduce what's below as a sanity check. It's about 10 lines
> added to one of the samples.
>
> Here's the story:
>
> My POJO-style client wasn't getting exceptions from its POJO-style
> service. So I went back to the samples/pojo example, and threw an
> exception from a method. The client got it. Hmm. I just couldn't
> figure out what the difference was between my code and the sample.
> Then I realized that my methods return void.
>
> So I added this to AddressBookService.java in samples/pojo, a method
> returning void, then a second returning String:
>
>    public void test1(String s) throws Exception {
> throw new Exception("test1");
>    }
>
>    public String test2(String s) throws Exception {
> throw new Exception("test2");
>    }
>
> And this to AddressBookADBClient.java:
>
>            Test1 test1 = new Test1();
>            test1.setParam0("foo");
>            stub.test1(test1);
>
>            Test2 test2 = new Test2();
>            test2.setParam0("bar");
>            stub.test2(test2);
>
> Here's a snippet from the server-side log:
>
> Apr 14, 2007 10:55:28 AM
> org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver
> invokeBusinessLogic
> SEVERE: test1
> java.lang.reflect.InvocationTargetException
> Caused by: java.lang.Exception: test1
>        at sample.addressbook.service.AddressBookService.test1(Unknown 
> Source)
>        ... 35 more
> Apr 14, 2007 10:55:29 AM
> org.apache.axis2.rpc.receivers.RPCMessageReceiver invokeBusinessLogic
> SEVERE: test2
> java.lang.reflect.InvocationTargetException
> Caused by: java.lang.Exception: test2
>        at sample.addressbook.service.AddressBookService.test2(Unknown 
> Source)
>        ... 35 more
>
> As you can see, both exceptions are thrown.
>
> Now here's the client (NOTICE: No evidence of an exception from the
> test1 method):
>
> adb.client.run:
>     [java] Name   :Abby Cadabby
>     [java] Street :Sesame Street
>     [java] City   :Sesame City
>     [java] State  :Sesame State
>     [java] Postal Code :11111
>     [java] org.apache.axis2.AxisFault: test2
>     [java]     at
> org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.jav
> a:271)
>     [java]     at
> org.apache.axis2.description.OutInAxisOperationClient.execute(OutInAxisOperation.
> java:202)
>     [java]     at
> sample.addressbook.stub.AddressBookServiceStub.test2(Unknown Source)
>
> So I guess that the workaround is that I'll have to have all of my
> methods return something: Perhaps a String, or maybe I'll create a
> JavaBean class called Nothing. Or maybe even Void with a capital V.
>
> This is a really awful bug.
>
> On 4/10/07, John G. Norman <jo...@7fff.com> wrote:
>> With a POJO Service:
>>
>> I have now tried the strategy here:
>>
>> http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/integration/test/org/apache/axis2/engine/util/FaultThrowingService.java?view=markup
>>
>> Still not seeing the exception on the client that calls the service .
>> . . Still getting:
>>
>> > FaultReason; nested exception is:
>> >         java.lang.Exception: This is a test Exception
>> > java.lang.reflect.InvocationTargetException
>> >         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>> >         at 
>> > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>> >         at 
>> > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>> >         at java.lang.reflect.Method.invoke(Method.java:324)
>> > [much deleted]
>> >
>> > Caused by: org.apache.axis2.AxisFault: FaultReason; nested exception 
>> > is:
>> >         java.lang.Exception: This is a test Exception
>> >         at com.myco.Service.test(Service.java:45)
>> >         ... 48 more
>> > Caused by: java.lang.Exception: This is a test Exception
>> >         ... 49 more
>> > DEBUG 16:24:37,843 org.apache.axis2.AxisFault: FaultReason; nested
>> > exception is:
>> >         java.lang.Exception: This is a test Exception
>> > DEBUG 16:24:37,843 isReplyRedirected: FaultTo is null. Returning
>> > isReplyRedirected
>> > DEBUG 16:24:37,843 isReplyRedirected: ReplyTo is null. Returning false
>> >
>>
>> On 4/9/07, John G. Norman <jo...@7fff.com> wrote:
>> > Hi all.
>> >
>> > This is a great topic -- how to manage exceptions for services built
>> > on POJOs. If it is as easy as the link Anne Manes provided
>> > (http://wso2.org/library/171) then throwing exceptions might well be
>> > included in the main Axis2 docs at
>> > http://ws.apache.org/axis2/1_1_1/pojoguide.html).
>> >
>> > But I just tried throwing an exception out of a POJO's method  (the
>> > basis for a service as described here:
>> > http://ws.apache.org/axis2/1_1_1/pojoguide.html), and the exception
>> > doesn't seem to make it back to the client.
>> >
>> > Does the QName need to match one of the faults defined in the client 
>> > stub?
>> >
>> > In any case, the code looks like this:
>> >
>> >   public void test() throws AxisFault {
>> > throw      new AxisFault(new QName("http://test.org", "FaultCode",
>> > "test"), "FaultReason", new Exception("This is a test Exception"));
>> >   }
>> >
>> > On the server, the trace looks like this:
>> >
>> > FaultReason; nested exception is:
>> >         java.lang.Exception: This is a test Exception
>> > java.lang.reflect.InvocationTargetException
>> >         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>> >         at 
>> > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>> >         at 
>> > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>> >         at java.lang.reflect.Method.invoke(Method.java:324)
>> > [much deleted]
>> >
>> > Caused by: org.apache.axis2.AxisFault: FaultReason; nested exception 
>> > is:
>> >         java.lang.Exception: This is a test Exception
>> >         at com.myco.Service.test(Service.java:45)
>> >         ... 48 more
>> > Caused by: java.lang.Exception: This is a test Exception
>> >         ... 49 more
>> > DEBUG 16:24:37,843 org.apache.axis2.AxisFault: FaultReason; nested
>> > exception is:
>> >         java.lang.Exception: This is a test Exception
>> > DEBUG 16:24:37,843 isReplyRedirected: FaultTo is null. Returning
>> > isReplyRedirected
>> > DEBUG 16:24:37,843 isReplyRedirected: ReplyTo is null. Returning false
>> >
>> > On 4/3/07, Anne Thomas Manes <at...@gmail.com> wrote:
>> > > See http://wso2.org/library/171.
>> > >
>> > > On 4/3/07, Chan, Herman <He...@inquent.com> wrote:
>> > > >
>> > > >
>> > > >
>> > > >
>> > > > Hi all:
>> > > >
>> > > >
>> > > >
>> > > > I am relatively new to Axis 2 and web services in general, so 
>> > > > please bear
>> > > > with me if I ask any stupid questions.
>> > > >
>> > > >
>> > > >
>> > > > I am writing a very simple web service that would return a list of
>> > > > directories on a server.  However, if certain directories does not 
>> > > > exists,
>> > > > I'd like a throw an error back to the calling client.
>> > > >
>> > > >
>> > > >
>> > > > I am using the POJO approach to create web services using axis2, so 
>> > > > is it
>> > > > good enough for me to throw a plain Exception or do I have to do 
>> > > > more?  What
>> > > > is the best practice in doing error handling in web services?
>> > > >
>> > > >
>> > > >
>> > > > Thanks in advance.
>> > > >
>> > > >
>> > > >
>> > > > Herman Chan
>> > > >
>> > > >
>> > >
>> > > ---------------------------------------------------------------------
>> > > To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
>> > > For additional commands, e-mail: axis-user-help@ws.apache.org
>> > >
>> > >
>> >
>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
> For additional commands, e-mail: axis-user-help@ws.apache.org
>
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-user-help@ws.apache.org