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

Reply via email to