Hi all

I have generated a client stub to call a 3rd party web service using
Wsdl2Java.  The provided WSDL (and XSDs imported it) includes a number of
faults which are generated and returned by Axis2 as exceptions (all as per
usual so far).

However, the actual Soap message returned by the web service when a fault
is encountered also includes some handy information outside of the Detail
element, namely in the Reason element.  An example is below:

<s:Body>
  <s:Fault>
 <s:Code>
<s:Value>s:Sender</s:Value>
 </s:Code>
 <s:Reason>
<s:Text xml:lang="en-AU">The RegistrationEndDateTime has an invalid
datetime format. Check that it does not specify timezone information or
have more than seconds precision.</s:Text>
 </s:Reason>
 <s:Detail>
<InvalidDateTimeFormatFaultDetail xmlns="http://schemas.xyz/faults";
xmlns:i="http://www.w3.org/2001/XMLSchema-instance";>
   <ErrorNumber>50016</ErrorNumber>

<ErrorReferenceId>7f2f1085-9c7e-44a8-b1b7-2a995d0a4e0f</ErrorReferenceId>
   <RequestProcessedByEnvironment>Discovery</RequestProcessedByEnvironment>
   <ElementName>RegistrationEndDateTime</ElementName>
</InvalidDateTimeFormatFaultDetail>
 </s:Detail>
  </s:Fault>
</s:Body>

The InvalidDateTimeFormatFaultDetail is what is defined in the WSDL/XSD.
 Axis2 only generates this detail bit as the exception - the rest is
abandoned.  I therefore don't have access to the other soap fault fields,
such as Code and Reason.

I had a look at the stub, and can see where it catches an AxisFault, pulls
out its Detail element, matches it up with one of the defined exceptions
from the WSDL, and populates and throws an instance of the WSDL exception
with the details from the Detail element.

Is there any way to work-around this so I can get access to the Reason
data?

One thing I did try was generating the stub with a different exception base
class (using -ebc) of org.apache.axis2.AxisFault. This actually ends up
providing the info I need, mainly because in the stub it gets an
instantiation exception when trying to instantiate the WSDL exception and
cast it to java.lang.Exception.  The stub then throws the original
AxisFault.  This provides me all the data I want, but it seems kind of
wrong to do it this way (i.e. getting the data through the fact the stub
can't process the exception properly :-) ).  Thoughts anyone?

Thanks heaps
Matt

Reply via email to