Hi,

I've had a rather long time problem with custom Faults in Java Axis 1.2. The problem is properly handling a custom Fault in client. Here's the original WSDL describing the web service:

<?xml version="1.0" encoding="UTF-8"?>
<definitions targetNamespace="urn:serapi:SOAPExample"
xmlns="http://schemas.xmlsoap.org/wsdl/";
xmlns:serapi="urn:serapi:SOAPExample"
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/";
xmlns:xsd="http://www.w3.org/2001/XMLSchema";>
<types>
<schema elementFormDefault="qualified" targetNamespace="urn:serapi:SOAPExample" xmlns="http://www.w3.org/2001/XMLSchema";>
<element name="echoText">
<complexType>
<sequence>
<element name="text" type="xsd:string"/>
</sequence>
</complexType>
</element>


   <element name="echoTextResponse">
    <complexType>
     <sequence>
      <element name="echoedText" type="xsd:string"/>
     </sequence>
    </complexType>
   </element>

   <element name="noEchoTextProvided"/>
  </schema>
 </types>

 <message name="echoTextRequestMessage">
  <part element="serapi:echoText" name="parameters"/>
 </message>
 <message name="echoTextResponseMessage">
  <part element="serapi:echoTextResponse" name="parameters"/>
 </message>
 <message name="noEchoTextProvided">
  <part element="serapi:noEchoTextProvided" name="fault"/>
 </message>

 <portType name="EchoServiceOperations">
  <operation name="echoText">
   <input message="serapi:echoTextRequestMessage"/>
   <output message="serapi:echoTextResponseMessage"/>
   <fault name="noEchoTextProvided" message="serapi:noEchoTextProvided"/>
  </operation>
 </portType>

<binding name="EchoServiceBinding" type="serapi:EchoServiceOperations">
<wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="echoText">
<wsdlsoap:operation soapAction="urn:serapi:SOAPExample#echoText"/>
<input>
<wsdlsoap:body use="literal"/>
</input>
<output>
<wsdlsoap:body use="literal"/>
</output>
<fault name="noEchoTextProvided">
<wsdlsoap:fault name="noEchoTextProvided" use="literal"/>
</fault>
</operation>
</binding>


This is pretty much WS-I Basic Profile 1.1 compliant stuff. The Fault element (noEchoTextProvided) is defined as an Element in the message instead of Type.

When I run this through wsdl2java everything seems to be fine. But when I create a simple implementation for the service and throw a NoEchoTextProvided fault from there, the problems begin. Here's the SOAP message containing the Fault:

<?xml version="1.0" encoding="utf-8"?><soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/";
xmlns:xsd="http://www.w3.org/2001/XMLSchema";
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";>
<soapenv:Body>
<soapenv:Fault>
<faultcode>soapenv:Server.generalException</faultcode>
<faultstring>Echoed text seems to be an empty value, which is not allowed.
</faultstring>
<detail>
<ns1:noEchoTextProvided xmlns:ns1="urn:serapi:SOAPExample">No value</ns1:noEchoTextProvided>
<ns2:exceptionName xmlns:ns2="http://xml.apache.org/axis/";>org.serapi.SOAPExample.NoEchoTextProvided</ns2:exceptionName>
<ns3:hostname xmlns:ns3="http://xml.apache.org/axis/";>laivuri27</ns3:hostname>
</detail>
</soapenv:Fault>
</soapenv:Body>
</soapenv:Envelope>


The SOAP message seems fine. But in the Axis client this always ends up in a NullPointerException:

AxisFault
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
faultSubcode:
faultString: java.lang.NullPointerException
faultActor:
faultNode:
faultDetail:
{http://xml.apache.org/axis/}stackTrace:java.lang.NullPointerException
at org.apache.axis.client.Call.invokeEngine(Call.java:2797)
at org.apache.axis.client.Call.invoke(Call.java:2748)
at org.apache.axis.client.Call.invoke(Call.java:2424)
at org.apache.axis.client.Call.invoke(Call.java:2347)
at org.apache.axis.client.Call.invoke(Call.java:1804)
at org.serapi.SOAPExample.EchoServiceBindingStub.echoText(EchoServiceBindingStub.java:168)
at org.serapi.SOAPClient.EchoTextClient.&lt;init&gt;(EchoTextClient.java:15)
at org.serapi.SOAPClient.EchoTextClient.main(EchoTextClient.java:24)


        {http://xml.apache.org/axis/}hostname:laivuri27

java.lang.NullPointerException
at org.apache.axis.AxisFault.makeFault(AxisFault.java:101)
at org.apache.axis.client.Call.invoke(Call.java:2427)
at org.apache.axis.client.Call.invoke(Call.java:2347)
at org.apache.axis.client.Call.invoke(Call.java:1804)
at org.serapi.SOAPExample.EchoServiceBindingStub.echoText(EchoServiceBindingStub.java:168)
at org.serapi.SOAPClient.EchoTextClient.<init>(EchoTextClient.java:15)
at org.serapi.SOAPClient.EchoTextClient.main(EchoTextClient.java:24)
Caused by: java.lang.NullPointerException
at org.apache.axis.client.Call.invokeEngine(Call.java:2797)
at org.apache.axis.client.Call.invoke(Call.java:2748)
at org.apache.axis.client.Call.invoke(Call.java:2424)
... 5 more


It would seem that the client does not correctly deserialize the Fault element. If I use AxisFaults instead of a custom Fault class, everything is fine. Do I have to put something in the client-config.wsdd to properly deserialize the Fault or something similar?

--
Marko Sormunen, M.Sc.
Messenger: [EMAIL PROTECTED]
HIS-research unit, Centek, Computing Centre
University of Kuopio

Reply via email to