You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-user@axis.apache.org by frantz <fr...@e-manation.com> on 2005/12/12 15:28:51 UTC
Problem with exceptions and "wrapped" style
Hello,
By default, exceptions seem to be not properly serialized with
literal/wrapped mode :
I am writing a Web Service connector for an existing Java application.
My connector exception extends the java.rmi.RemoteException one
(according to the user's help advice) and I had registered a bean
mapping for it.
It works well with the "RPC/encoded" mode. The issue is with the
"literal - wrapped" mode : by default, the exceptions are not properly
serialized so the client-side (which use wsdl2Java generated stubs)
cannot re-interpret them (and throws them as AxisFaults).
the SOAP message looks like this (the custom exception namespace is
missing) :
<soapenv:Body>
<soapenv:Fault>
<faultcode>soapenv:Server.userException</faultcode>
<faultstring>samples.faults.NoSuchEmployeeFault</faultstring>
<detail>
<samples.faults.NoSuchEmployeeFault>
<cause xsi:nil="true"/>
<info>Could not find employee : foo</info>
</samples.faults.NoSuchEmployeeFault>
<ns1:hostname xmlns:ns1="http://xml.apache.org/axis/">comp02</ns1:hostname>
</detail>
</soapenv:Fault>
</soapenv:Body>
instead of something like this :
<soapenv:Body>
<soapenv:Fault>
<faultcode>soapenv:Server.userException</faultcode>
<faultstring>samples.faults.NoSuchEmployeeFault</faultstring>
<detail>
<ns1:fault xmlns:ns1="http://faults.samples">
<ns1:cause xsi:nil="true"/>
<ns1:info>Could not find employee : foo</ns1:info>
</ns1:fault>
<ns2:hostname xmlns:ns2="http://xml.apache.org/axis/">comp02</ns2:hostname>
</detail>
</soapenv:Fault>
</soapenv:Body>
I have tried to set my own serializer to solve this problem but the
"getSerializerAs" method of my factory was never called.
Is there a special treatment for exceptions (I probably missed
something, but what...) ?
Lastly, I have investigated a bit further (on the samples/faults) and I
have found that the problem can be solved by declaring the complete
signature of methods which throws exceptions in the .wsdd deploying
file. We can do this using the <fault> tag under the <operation> one.
example :
<operation name="getEmployee" qname="ns:getEmployee"
returnQName="ns:getEmployeeReturn" returnType="ns:Employee" xmlns:ns="http://faults.samples">
<parameter name="id" type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema"/>
<fault name="NoSuchEmployeeFault" qname="fns:NoSuchEmployeeFault" xmlns:fns="http://faults.samples"
class="samples.faults.NoSuchEmployeeFault" type="tns:NoSuchEmployeeFault" xmlns:tns="http://faults.samples"/>
</operation>
Finally, my program works fine. But, I think the solution I have found
is not very handy because I have to write a large (more than 2x the size
of the server interface) and boring deploying file.
Is it possible to declare somewhere, how Axis should serialize my
exception, instead of re-declare each operation signatures ?
--
Frantz <fr...@e-manation.com>