You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tuscany.apache.org by Simon Laws <si...@googlemail.com> on 2007/09/16 22:38:49 UTC

Axis2 fault handling

If Axis2 returns a fault it sets the fault into the contents of the original
message. In the Axis2BindingInvoker the invoke code looks like this...

    public Message invoke(Message msg) {
        try {
            Object resp = invokeTarget(msg);
            msg.setBody(resp);
        } catch (AxisFault e) {
            if (e.getDetail() != null) {
                FaultException f = new FaultException(e.getMessage(),
e.getDetail());
                f.setLogical(e.getDetail().getQName());
                msg.setFaultBody(f);
            } else {
                msg.setFaultBody(e);
            }
        } catch (Throwable e) {
            msg.setFaultBody(e);
        }

        return msg;
    }

Why does it set values in the input message as well as returning it as a
return value? I can see the point in the case of a real return value as you
avoid the resource of creating a extra message object. In the fault case
though this limits the ability of the infrastructure to resend the message
if it wants to as it gets overwritten.

Simon

Re: Axis2 fault handling

Posted by Simon Nash <na...@hursley.ibm.com>.
It has been this way for a long time.  I suspect that until now no-one
has thought of the retransmission use case.  I agree that this is a
good reason for creating a new message object to hold the exception.
What do the other bindings do?

   Simon

Simon Laws wrote:

> If Axis2 returns a fault it sets the fault into the contents of the original
> message. In the Axis2BindingInvoker the invoke code looks like this...
> 
>     public Message invoke(Message msg) {
>         try {
>             Object resp = invokeTarget(msg);
>             msg.setBody(resp);
>         } catch (AxisFault e) {
>             if (e.getDetail() != null) {
>                 FaultException f = new FaultException(e.getMessage(),
> e.getDetail());
>                 f.setLogical(e.getDetail().getQName());
>                 msg.setFaultBody(f);
>             } else {
>                 msg.setFaultBody(e);
>             }
>         } catch (Throwable e) {
>             msg.setFaultBody(e);
>         }
> 
>         return msg;
>     }
> 
> Why does it set values in the input message as well as returning it as a
> return value? I can see the point in the case of a real return value as you
> avoid the resource of creating a extra message object. In the fault case
> though this limits the ability of the infrastructure to resend the message
> if it wants to as it gets overwritten.
> 
> Simon
> 



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