You need to define a type for your noEchoTextProvided element. This definition:
<element name="noEchoTextProvided"/>
defaults to type="xsd:anyType", and therefore Axis is looking for a
deserializer. If you want to return an empty element, then you should
define it like this:
<element name="noEchoTextProvided">
<complexType>
<sequence/>
</complexType>
</element>
Anne
On 5/16/05, Marko Sormunen <[EMAIL PROTECTED]> wrote:
>
> 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.<init>(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
>