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 Eric Borisow <eb...@yahoo.com> on 2006/08/03 03:11:09 UTC
Question about handling custom exceptions in Axis 1.3
Hi,
I have been trying to piece together the best way to
generate and consume a custom exception with Axis
1_3. I have created a test with an interface, a
service implementation of the interface and an
Exception.
When I generate the wsdl using java2wsdl, the wsdl
contains a reference to the TestException class as a
fault of the service. When I call the service, it
returns an AxisFault containing information about the
fault. My question is... what can I do with that
RemoteException to get my exception out of it? I have
seen some other articles where it seems you should
just be able to catch your custom exception but all I
ever get is RemoteException which I then have to
convert to an AxisFault but I still don't get access
to my exception per se. See below for my code.
Thanks,
Eric
Interface:
public interface IServiceTest
{
public void throwError() throws TestException;
}
Service implementation:
public class Service implements IServiceTest
{
public void throwError() throws TestException
{
throw new TestException();
}
}
Exception:
import java.io.Serializable;
public class TestException extends Exception
implements Serializable
{
private String someError;
public TestException() {}
public TestException(String someError)
{
this.someError = someError;
}
public String getSomeError()
{
return someError;
}
public void setSomeError(String someError)
{
this.someError = someError;
}
}
wsdl:
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions
targetNamespace="http://services.spx.com"
xmlns:impl="http://services.spx.com"
xmlns:intf="http://services.spx.com"
xmlns:apachesoap="http://xml.apache.org/xml-soap"
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<!--WSDL created by Apache Axis version: 1.3
Built on Oct 05, 2005 (05:23:37 EDT)-->
<wsdl:types>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://services.spx.com">
<import
namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
<complexType name="TestException">
<sequence>
<element name="someError" nillable="true"
type="xsd:string"/>
</sequence>
</complexType>
</schema>
</wsdl:types>
<wsdl:message name="TestException">
<wsdl:part name="fault"
type="impl:TestException"/>
</wsdl:message>
<wsdl:message name="throwErrorRequest">
</wsdl:message>
<wsdl:message name="throwErrorResponse">
</wsdl:message>
<wsdl:portType name="Service">
<wsdl:operation name="throwError">
<wsdl:input name="throwErrorRequest"
message="impl:throwErrorRequest"/>
<wsdl:output name="throwErrorResponse"
message="impl:throwErrorResponse"/>
<wsdl:fault name="TestException"
message="impl:TestException"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="axisexceptiontestSoapBinding"
type="impl:Service">
<wsdlsoap:binding style="rpc"
transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="throwError">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="throwErrorRequest">
<wsdlsoap:body use="encoded"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace="http://services.spx.com"/>
</wsdl:input>
<wsdl:output name="throwErrorResponse">
<wsdlsoap:body use="encoded"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace="http://services.spx.com"/>
</wsdl:output>
<wsdl:fault name="TestException">
<wsdlsoap:fault name="TestException"
use="encoded"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace="http://services.spx.com"/>
</wsdl:fault>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="ServiceService">
<wsdl:port name="axisexceptiontest"
binding="impl:axisexceptiontestSoapBinding">
<wsdlsoap:address
location="http://localhost:7080/axisexceptiontest/services/axisexceptiontest"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
And finally, the text client code:
import java.io.StringWriter;
import java.rmi.RemoteException;
import javax.xml.namespace.QName;
import javax.xml.rpc.soap.SOAPFaultException;
import org.apache.axis.AxisFault;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.xml.serialize.OutputFormat;
import org.apache.xml.serialize.XMLSerializer;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class ManualServiceTest
{
/**
* @param args
*/
public static void main(String[] args)
{
try
{
Service service = new Service();
Call call = (Call)
service.createCall();
String endpointURL =
"http://localhost:81/axisexceptiontest/services/axisexceptiontest";
call.setTargetEndpointAddress( new
java.net.URL(endpointURL) );
call.setOperationName( new
QName("urn:axisexceptiontest", "throwError") );
// Integer response = (Integer)
call.invoke( new Object[] { TestException,
"ldapTestException" } );
call.invoke(new Object[] { });
}catch(SOAPFaultException fault){
fault.printStackTrace();
System.out.println("Fault Detail : "+
fault.getDetail());
System.out.println("Fault Actor : "+
fault.getFaultActor());
System.out.println("Fault String: "+
fault.getFaultString());
} catch (RemoteException gbe) {
System.out.println(gbe.toString());
gbe.printStackTrace();
System.out.println("Class of exception is:
" + gbe.getClass().getName());
if (gbe instanceof AxisFault)
{
System.out.println("Exception is an
Axis Fault");
AxisFault fault = (AxisFault) gbe;
System.out.println("Fault reason is:
");
System.out.println(fault.getFaultReason());
System.out.println("Fault string is:
");
System.out.println(fault.getFaultString());
System.out.println("Fault Actor : "+
fault.getFaultActor());
System.out.println("Fault String: "+
fault.getFaultString());
try
{
Element[] detail =
fault.getFaultDetails();
for (int i=0; i<detail.length;
i++)
System.out.println(
documentToString(detail[i].getOwnerDocument()));
}
catch (Exception e)
{
e.printStackTrace();
}
}
} catch (Exception e) {
System.out.println(e.toString());
e.printStackTrace();
System.out.println("Class of exception is:
" + e.getClass().getName());
}
}
static String documentToString(Document doc)
throws Exception {
OutputFormat format = new OutputFormat( doc );
StringWriter stringOut = new StringWriter();
XMLSerializer serial = new XMLSerializer(
stringOut, format );
serial.asDOMSerializer();
serial.serialize( doc.getDocumentElement() );
return stringOut.toString();
}
}
__________________________________________________
Do You Yahoo!?
Tired of spam? Yahoo! Mail has the best spam protection around
http://mail.yahoo.com
---------------------------------------------------------------------
To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-user-help@ws.apache.org
Re: Question about handling custom exceptions in Axis 1.3
Posted by Daniel Beland <dc...@gmail.com>.
Hi,
I have been using custom exceptions for nearly 2 years now and it always
worked fine for me (since 1.2-RC2 I think).
But I start from the WSDL and have the java classes generated. I find it
easier to maintain 1 file and have 30 java classes generated than the
opposite. Once you understand a WSDL it is really easy to add parameters and
operations.
so my custom exception structure is:
<complexType name="WSException">
<sequence>
<element name="errorCode" type="xsd:int" nillable="false"/>
<element name="errorMessage" type="xsd:string" nillable="true"/>
<element name="trace" type="xsd:string" nillable="true"/>
</sequence>
</complexType>
I get the flowwing generated for me:
public class WSException extends org.apache.axis.AxisFault implements
java.io.Serializable {...}
And then when I use axis as a client too, the method throws back that
exception that I can catch directly (nothing to cast).
However there can be a small problem. Since I have a lot of WebServices, I
wanted to reuse the WSException in all of them, so I defined it in its own
XSD file, in its own namespace. ie: the exception is defined in namespace A
and the WebService namespace is B.
When the exception is returned, the namespace is A, when it should be B
(because the operation is in B, it is in the SOAP standard). So I had to
define a new constructor to override this problem:
public WSException(String namespace) {
super(new javax.xml.namespace.QName(namespace, "WSException"), null,
null, null);
}
Since I use axis 1.2-RC3 to generate my java classes, I don't know if this
problem has been fixed in later versions.
I use Axis, gSOAP and ActiveBPEL and all of them can handle my custom
exception.
Hope it can help,
Daniel
On 8/4/06, Eric Borisow <eb...@yahoo.com> wrote:
>
> Derek,
>
> Thanks for the reply, but I have found the answer. I
> found most of the answer in the Axis samples\faults
> directory, but they leave out some info. I will post
> what I found so it will hopefully help someone else.
>
> 1. Your Exception should extend Exception and not
> RemoteException.
>
> This should be done for a few reasons:
> a) It is the approach that the samples use.
> b) You probably would rather extend Exception than
> RemoteException as a general programming practice.
> c) I, personally, did not seem to get this working if
> I used RemoteException. Axis gives you a
> RemoteException that is your class, but I could not
> find a way to correctly cast it back to my Exception.
>
> 2. Your Exception must have a constructor that accepts
> all of the properties to be set.
>
> There is a technical reason here that I read in one of
> the posts out there, but I can't remember where it is.
> It was something about Axis needing to be able to set
> these properties in the Constructor and not in a
> setter. Here is my sample Exception:
>
> import java.io.Serializable;
>
> public class TestException extends Exception
> implements Serializable
> {
> private String someError;
>
> public TestException() {}
>
> public TestException(String someError)
> {
> this.someError = someError;
> }
>
> public String getSomeError()
> {
> return this.someError;
> }
>
> public void setSomeError(String someError)
> {
> this.someError = someError;
> }
>
> }
>
> 3. Your service should throw RemoteException and the
> custom Exception.
>
> Here is a sample:
>
> import java.rmi.RemoteException;
>
> public interface IServiceTest
> {
> public void throwError() throws RemoteException,
> TestException;
> }
>
> 4. Catch AxisFault in your client.
>
> If you're using the stubs generated by Axis, you don't
> need to worry about this, but if you're using what I
> like to call the manual method, then you need to catch
> it as an AxisFault.
>
> Here is the sample code:
>
> import java.io.StringWriter;
> import java.net.URL;
> import java.rmi.RemoteException;
>
> import javax.xml.namespace.QName;
> import javax.xml.rpc.Call;
> import javax.xml.rpc.Service;
> import javax.xml.rpc.ServiceFactory;
> import javax.xml.rpc.encoding.TypeMapping;
> import javax.xml.rpc.encoding.TypeMappingRegistry;
>
> import org.apache.axis.AxisFault;
> import
> org.apache.axis.encoding.ser.BeanDeserializerFactory;
> import
> org.apache.axis.encoding.ser.BeanSerializerFactory;
> import org.apache.xml.serialize.OutputFormat;
> import org.apache.xml.serialize.XMLSerializer;
> import org.w3c.dom.Document;
> import org.w3c.dom.Element;
>
> import com.spx.services.TestException;
>
> public class ManualServiceTest
> {
>
> /**
> * @param args
> */
> public static void main(String[] args)
> {
> try
> {
> ServiceFactory serviceFactory =
> ServiceFactory.newInstance();
> Service service =
> serviceFactory.createService(new
> QName("urn:axisexceptiontest", "ServiceService"));
> Call call = (Call)
> service.createCall();
> String endpointURL =
> "http://localhost:8080/axisexceptiontest/services/axisexceptiontest";
>
>
> call.setTargetEndpointAddress(new
> URL(endpointURL).toString());
> call.setOperationName( new
> QName("urn:axisexceptiontest", "throwError") );
>
> TypeMappingRegistry registry =
> service.getTypeMappingRegistry();
> TypeMapping map =
> registry.getDefaultTypeMapping();
>
> // Don't forget to register your exception!!!
> QName faultQName = new
> QName("urn:axisexceptiontest", "TestException");
> map.register(TestException.class,
> faultQName,
> new BeanSerializerFactory(
> TestException.class,
> faultQName),
> new
> BeanDeserializerFactory(TestException.class,
> faultQName));
>
> call.invoke(new Object[] { });
> }
> catch(AxisFault fault)
> {
> System.out.println("Error type is Axis
> Fault");
>
> System.out.println("Fault actor : "+
> fault.getFaultActor());
> System.out.println("Fault string: "+
> fault.getFaultString());
> System.out.println("Fault reason: "+
> fault.getFaultReason());
> System.out.println("Fault code: "+
> fault.getFaultCode());
>
> Object cause = fault.getCause();
> if (cause != null)
> {
> System.out.println("Class of cause is:
> " + cause.getClass().getName());
> if (cause instanceof TestException)
> {
> TestException myEx =
> (TestException) cause;
> System.out.println("Error message
> from my exception: " + myEx.getSomeError());
> }
> }
> }
> }
> }
>
> Finally, here was my server-config.wsdd:
>
> <?xml version="1.0" encoding="UTF-8"?>
> <deployment xmlns="http://xml.apache.org/axis/wsdd/"
> xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
> <globalConfiguration>
> <parameter name="adminPassword" value="admin"/>
> <parameter name="sendMultiRefs" value="false"/>
> <parameter name="sendXsiTypes" value="true"/>
> <parameter name="sendXMLDeclaration" value="true"/>
> <parameter name="dotNetSoapEncFix" value="true"/>
> </globalConfiguration>
> <handler name="LocalResponder"
> type="java:org.apache.axis.transport.local.LocalResponder"/>
> <handler name="URLMapper"
> type="java:org.apache.axis.handlers.http.URLMapper"/>
> <handler name="Authenticate"
> type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/>
> <handler name="MsgDispatcher"
> type="java:org.apache.axis.providers.java.MsgProvider"/>
> <handler name="RPCDispatcher"
> type="java:org.apache.axis.providers.java.RPCProvider"/>
>
> <service name="axisexceptiontest" provider="java:RPC"
> style="rpc" use="encoded">
> <parameter name="allowedMethods" value="*"/>
> <parameter name="wsdlPortType" value="Service"/>
> <parameter name="className"
> value="com.spx.services.Service"/>
> <parameter name="wsdlServicePort"
> value="axisexceptiontest"/>
> <parameter name="wsdlTargetNamespace"
> value="urn:axisexceptiontest"/>
> <parameter name="wsdlServiceElement"
> value="ServiceService"/>
> <beanMapping qname="ns:TestException"
> xmlns:ns="urn:axisexceptiontest"
>
> languageSpecificType="java:com.spx.services.TestException"/>
>
> </service>
> <service name="AdminService" provider="java:MSG">
> <parameter name="allowedMethods"
> value="AdminService"/>
> <parameter name="enableRemoteAdmin" value="true"/>
> <parameter name="className"
> value="org.apache.axis.utils.Admin"/>
>
> <namespace>http://xml.apache.org/axis/wsdd/</namespace>
> </service>
> <service name="Version" provider="java:RPC">
> <parameter name="allowedMethods"
> value="getVersion"/>
> <parameter name="className"
> value="org.apache.axis.Version"/>
> </service>
> <transport name="http">
> <requestFlow>
> <handler type="URLMapper"/>
> <handler
> type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/>
> </requestFlow>
> </transport>
> <transport name="local">
> <responseFlow>
> <handler type="LocalResponder"/>
> </responseFlow>
> </transport>
> </deployment>
>
> I hope this helps someone else.
>
> Thanks,
> Eric
>
>
> --- Derek <de...@crc-corp.com> wrote:
>
> > In general, you cannot send arbitrary exceptions to
> > remote clients, since
> > Axis (or most other client/server communication
> > protocols) has no idea how
> > to serialize/deserialize an arbitrary exception that
> > you might have created
> > so that it can be transmitted to a remote client.
> > You should probably only
> > be sending subclasses of RemoteException, and
> > probably should include very
> > limited, if any, additional information in the
> > exception class itself. I
> > suggest that you make sure that your TestException
> > extends RemoteException,
> > not just Exception.
> >
> > I am not sure how this works if a RemoteException
> > has a 'cause' field which
> > is not a RemoteException. I am not an expert in what
> > RemoteException is
> > capable of, but I think I know enough to understand
> > that what you are trying
> > to do (throw an exception that is not derived from
> > RemoteException from
> > server to client) is not, in general, possible.
> >
> > Derek
> >
> >
> >
> > > -----Original Message-----
> > > From: Eric Borisow [mailto:eborisow@yahoo.com]
> > > Sent: Thursday, August 03, 2006 6:33 AM
> > > To: axis-user@ws.apache.org
> > > Subject: Re: Question about handling custom
> > exceptions in Axis 1.3
> > >
> > >
> > > I tried using this line:
> > >
> > > TestException myEx = (TestException) gbe;
> > >
> > > But, it won't even compile. It gives me the
> > error:
> > > Cannot cast from RemoteException to TestException.
> > Is
> > > there something I am missing?
> > >
> > > Thanks,
> > > Eric
> > >
> > > --- xu cai <je...@gmail.com> wrote:
> > >
> > > > AxisFault extends from RemoteException, I think
> > you
> > > > can simply cast
> > > > RemoteException to your customized exception.
> > hope
> > > > it works.
> > > >
> > > > -jeff
> > > >
> > > >
> > > > On 8/3/06, Eric Borisow <eb...@yahoo.com>
> > wrote:
> > > > >
> > > > > Hi,
> > > > >
> > > > > I have been trying to piece together the best
> > way
> > > > to
> > > > > generate and consume a custom exception with
> > Axis
> > > > > 1_3. I have created a test with an interface,
> > a
> > > > > service implementation of the interface and an
> > > > > Exception.
> > > > >
> > > > > When I generate the wsdl using java2wsdl, the
> > wsdl
> > > > > contains a reference to the TestException
> > class as
> > > > a
> > > > > fault of the service. When I call the
> > service, it
> > > > > returns an AxisFault containing information
> > about
> > > > the
> > > > > fault. My question is... what can I do with
> > that
> > > RemoteException to
> > > > > get my exception out of it? I
> > > > have
> > > > > seen some other articles where it seems you
> > should
> > > > > just be able to catch your custom exception
> > but
> > > > all I
> > > > > ever get is RemoteException which I then have
> > to
> > > > > convert to an AxisFault but I still don't get
> > > > access
> > > > > to my exception per se. See below for my
> > code.
> > > > >
> > > > > Thanks,
> > > > > Eric
> > > > >
> > > > > Interface:
> > > > >
> > > > > public interface IServiceTest
> > > > > {
> > > > > public void throwError() throws
> > TestException;
> > > > > }
> > > > >
> > > > > Service implementation:
> > > > >
> > > > > public class Service implements IServiceTest
> > > > > {
> > > > >
> > > > > public void throwError() throws
> > TestException
> > > > > {
> > > > > throw new TestException();
> > > > > }
> > > > >
> > > > > }
> > > > >
> > > > > Exception:
> > > > >
> > > > > import java.io.Serializable;
> > > > >
> > > > > public class TestException extends Exception
> > > > > implements Serializable
> > > > > {
> > > > > private String someError;
> > > > >
> > > > > public TestException() {}
> > > > >
> > > > > public TestException(String someError)
> > > > > {
> > > > > this.someError = someError;
> > > > > }
> > > > >
> > > > > public String getSomeError()
> > > > > {
> > > > > return someError;
> > > > > }
> > > > >
> > > > > public void setSomeError(String someError)
> > > > > {
> > > > > this.someError = someError;
> > > > > }
> > > > >
> > > > >
> > > > > }
> > > > >
> > > > > wsdl:
> > > > >
> > > > > <?xml version="1.0" encoding="UTF-8"?>
> > > > > <wsdl:definitions
> > > > > targetNamespace="http://services.spx.com"
> > > > > xmlns:impl="http://services.spx.com"
> > > > > xmlns:intf="http://services.spx.com"
> > > > >
> > xmlns:apachesoap="http://xml.apache.org/xml-soap"
> > > > >
> > > >
> > >
> >
> xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
> > > > >
> > > >
> > >
> >
> xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
> > > > > xmlns:xsd="http://www.w3.org/2001/XMLSchema"
> > > > > xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
> > > > > <!--WSDL created by Apache Axis version: 1.3
> > > > > Built on Oct 05, 2005 (05:23:37 EDT)-->
> > > > > <wsdl:types>
> > > > > <schema
> > xmlns="http://www.w3.org/2001/XMLSchema"
> > > > > targetNamespace="http://services.spx.com">
> > > > > <import
> > > > >
> > > >
> > >
> >
> namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
> > > > > <complexType name="TestException">
> > > > > <sequence>
> > > > > <element name="someError" nillable="true"
> > type="xsd:string"/>
> > > > > </sequence>
> > > > > </complexType>
> > > > > </schema>
> > > > > </wsdl:types>
> > > > > <wsdl:message name="TestException">
> > > > > <wsdl:part name="fault"
> > > > > type="impl:TestException"/>
> > > > > </wsdl:message>
> > > > > <wsdl:message name="throwErrorRequest">
> >
> === message truncated ===
>
>
> __________________________________________________
> Do You Yahoo!?
> Tired of spam? Yahoo! Mail has the best spam protection around
> http://mail.yahoo.com
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
> For additional commands, e-mail: axis-user-help@ws.apache.org
>
>
RE: Question about handling custom exceptions in Axis 1.3
Posted by Eric Borisow <eb...@yahoo.com>.
Derek,
Thanks for the reply, but I have found the answer. I
found most of the answer in the Axis samples\faults
directory, but they leave out some info. I will post
what I found so it will hopefully help someone else.
1. Your Exception should extend Exception and not
RemoteException.
This should be done for a few reasons:
a) It is the approach that the samples use.
b) You probably would rather extend Exception than
RemoteException as a general programming practice.
c) I, personally, did not seem to get this working if
I used RemoteException. Axis gives you a
RemoteException that is your class, but I could not
find a way to correctly cast it back to my Exception.
2. Your Exception must have a constructor that accepts
all of the properties to be set.
There is a technical reason here that I read in one of
the posts out there, but I can't remember where it is.
It was something about Axis needing to be able to set
these properties in the Constructor and not in a
setter. Here is my sample Exception:
import java.io.Serializable;
public class TestException extends Exception
implements Serializable
{
private String someError;
public TestException() {}
public TestException(String someError)
{
this.someError = someError;
}
public String getSomeError()
{
return this.someError;
}
public void setSomeError(String someError)
{
this.someError = someError;
}
}
3. Your service should throw RemoteException and the
custom Exception.
Here is a sample:
import java.rmi.RemoteException;
public interface IServiceTest
{
public void throwError() throws RemoteException,
TestException;
}
4. Catch AxisFault in your client.
If you're using the stubs generated by Axis, you don't
need to worry about this, but if you're using what I
like to call the manual method, then you need to catch
it as an AxisFault.
Here is the sample code:
import java.io.StringWriter;
import java.net.URL;
import java.rmi.RemoteException;
import javax.xml.namespace.QName;
import javax.xml.rpc.Call;
import javax.xml.rpc.Service;
import javax.xml.rpc.ServiceFactory;
import javax.xml.rpc.encoding.TypeMapping;
import javax.xml.rpc.encoding.TypeMappingRegistry;
import org.apache.axis.AxisFault;
import
org.apache.axis.encoding.ser.BeanDeserializerFactory;
import
org.apache.axis.encoding.ser.BeanSerializerFactory;
import org.apache.xml.serialize.OutputFormat;
import org.apache.xml.serialize.XMLSerializer;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import com.spx.services.TestException;
public class ManualServiceTest
{
/**
* @param args
*/
public static void main(String[] args)
{
try
{
ServiceFactory serviceFactory =
ServiceFactory.newInstance();
Service service =
serviceFactory.createService(new
QName("urn:axisexceptiontest", "ServiceService"));
Call call = (Call)
service.createCall();
String endpointURL =
"http://localhost:8080/axisexceptiontest/services/axisexceptiontest";
call.setTargetEndpointAddress(new
URL(endpointURL).toString());
call.setOperationName( new
QName("urn:axisexceptiontest", "throwError") );
TypeMappingRegistry registry =
service.getTypeMappingRegistry();
TypeMapping map =
registry.getDefaultTypeMapping();
// Don't forget to register your exception!!!
QName faultQName = new
QName("urn:axisexceptiontest", "TestException");
map.register(TestException.class,
faultQName,
new BeanSerializerFactory(TestException.class,
faultQName),
new BeanDeserializerFactory(TestException.class,
faultQName));
call.invoke(new Object[] { });
}
catch(AxisFault fault)
{
System.out.println("Error type is Axis
Fault");
System.out.println("Fault actor : "+
fault.getFaultActor());
System.out.println("Fault string: "+
fault.getFaultString());
System.out.println("Fault reason: "+
fault.getFaultReason());
System.out.println("Fault code: "+
fault.getFaultCode());
Object cause = fault.getCause();
if (cause != null)
{
System.out.println("Class of cause is:
" + cause.getClass().getName());
if (cause instanceof TestException)
{
TestException myEx =
(TestException) cause;
System.out.println("Error message
from my exception: " + myEx.getSomeError());
}
}
}
}
}
Finally, here was my server-config.wsdd:
<?xml version="1.0" encoding="UTF-8"?>
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<globalConfiguration>
<parameter name="adminPassword" value="admin"/>
<parameter name="sendMultiRefs" value="false"/>
<parameter name="sendXsiTypes" value="true"/>
<parameter name="sendXMLDeclaration" value="true"/>
<parameter name="dotNetSoapEncFix" value="true"/>
</globalConfiguration>
<handler name="LocalResponder"
type="java:org.apache.axis.transport.local.LocalResponder"/>
<handler name="URLMapper"
type="java:org.apache.axis.handlers.http.URLMapper"/>
<handler name="Authenticate"
type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/>
<handler name="MsgDispatcher"
type="java:org.apache.axis.providers.java.MsgProvider"/>
<handler name="RPCDispatcher"
type="java:org.apache.axis.providers.java.RPCProvider"/>
<service name="axisexceptiontest" provider="java:RPC"
style="rpc" use="encoded">
<parameter name="allowedMethods" value="*"/>
<parameter name="wsdlPortType" value="Service"/>
<parameter name="className"
value="com.spx.services.Service"/>
<parameter name="wsdlServicePort"
value="axisexceptiontest"/>
<parameter name="wsdlTargetNamespace"
value="urn:axisexceptiontest"/>
<parameter name="wsdlServiceElement"
value="ServiceService"/>
<beanMapping qname="ns:TestException"
xmlns:ns="urn:axisexceptiontest"
languageSpecificType="java:com.spx.services.TestException"/>
</service>
<service name="AdminService" provider="java:MSG">
<parameter name="allowedMethods"
value="AdminService"/>
<parameter name="enableRemoteAdmin" value="true"/>
<parameter name="className"
value="org.apache.axis.utils.Admin"/>
<namespace>http://xml.apache.org/axis/wsdd/</namespace>
</service>
<service name="Version" provider="java:RPC">
<parameter name="allowedMethods"
value="getVersion"/>
<parameter name="className"
value="org.apache.axis.Version"/>
</service>
<transport name="http">
<requestFlow>
<handler type="URLMapper"/>
<handler
type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/>
</requestFlow>
</transport>
<transport name="local">
<responseFlow>
<handler type="LocalResponder"/>
</responseFlow>
</transport>
</deployment>
I hope this helps someone else.
Thanks,
Eric
--- Derek <de...@crc-corp.com> wrote:
> In general, you cannot send arbitrary exceptions to
> remote clients, since
> Axis (or most other client/server communication
> protocols) has no idea how
> to serialize/deserialize an arbitrary exception that
> you might have created
> so that it can be transmitted to a remote client.
> You should probably only
> be sending subclasses of RemoteException, and
> probably should include very
> limited, if any, additional information in the
> exception class itself. I
> suggest that you make sure that your TestException
> extends RemoteException,
> not just Exception.
>
> I am not sure how this works if a RemoteException
> has a 'cause' field which
> is not a RemoteException. I am not an expert in what
> RemoteException is
> capable of, but I think I know enough to understand
> that what you are trying
> to do (throw an exception that is not derived from
> RemoteException from
> server to client) is not, in general, possible.
>
> Derek
>
>
>
> > -----Original Message-----
> > From: Eric Borisow [mailto:eborisow@yahoo.com]
> > Sent: Thursday, August 03, 2006 6:33 AM
> > To: axis-user@ws.apache.org
> > Subject: Re: Question about handling custom
> exceptions in Axis 1.3
> >
> >
> > I tried using this line:
> >
> > TestException myEx = (TestException) gbe;
> >
> > But, it won't even compile. It gives me the
> error:
> > Cannot cast from RemoteException to TestException.
> Is
> > there something I am missing?
> >
> > Thanks,
> > Eric
> >
> > --- xu cai <je...@gmail.com> wrote:
> >
> > > AxisFault extends from RemoteException, I think
> you
> > > can simply cast
> > > RemoteException to your customized exception.
> hope
> > > it works.
> > >
> > > -jeff
> > >
> > >
> > > On 8/3/06, Eric Borisow <eb...@yahoo.com>
> wrote:
> > > >
> > > > Hi,
> > > >
> > > > I have been trying to piece together the best
> way
> > > to
> > > > generate and consume a custom exception with
> Axis
> > > > 1_3. I have created a test with an interface,
> a
> > > > service implementation of the interface and an
> > > > Exception.
> > > >
> > > > When I generate the wsdl using java2wsdl, the
> wsdl
> > > > contains a reference to the TestException
> class as
> > > a
> > > > fault of the service. When I call the
> service, it
> > > > returns an AxisFault containing information
> about
> > > the
> > > > fault. My question is... what can I do with
> that
> > RemoteException to
> > > > get my exception out of it? I
> > > have
> > > > seen some other articles where it seems you
> should
> > > > just be able to catch your custom exception
> but
> > > all I
> > > > ever get is RemoteException which I then have
> to
> > > > convert to an AxisFault but I still don't get
> > > access
> > > > to my exception per se. See below for my
> code.
> > > >
> > > > Thanks,
> > > > Eric
> > > >
> > > > Interface:
> > > >
> > > > public interface IServiceTest
> > > > {
> > > > public void throwError() throws
> TestException;
> > > > }
> > > >
> > > > Service implementation:
> > > >
> > > > public class Service implements IServiceTest
> > > > {
> > > >
> > > > public void throwError() throws
> TestException
> > > > {
> > > > throw new TestException();
> > > > }
> > > >
> > > > }
> > > >
> > > > Exception:
> > > >
> > > > import java.io.Serializable;
> > > >
> > > > public class TestException extends Exception
> > > > implements Serializable
> > > > {
> > > > private String someError;
> > > >
> > > > public TestException() {}
> > > >
> > > > public TestException(String someError)
> > > > {
> > > > this.someError = someError;
> > > > }
> > > >
> > > > public String getSomeError()
> > > > {
> > > > return someError;
> > > > }
> > > >
> > > > public void setSomeError(String someError)
> > > > {
> > > > this.someError = someError;
> > > > }
> > > >
> > > >
> > > > }
> > > >
> > > > wsdl:
> > > >
> > > > <?xml version="1.0" encoding="UTF-8"?>
> > > > <wsdl:definitions
> > > > targetNamespace="http://services.spx.com"
> > > > xmlns:impl="http://services.spx.com"
> > > > xmlns:intf="http://services.spx.com"
> > > >
> xmlns:apachesoap="http://xml.apache.org/xml-soap"
> > > >
> > >
> >
>
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
> > > >
> > >
> >
>
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
> > > > xmlns:xsd="http://www.w3.org/2001/XMLSchema"
> > > > xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
> > > > <!--WSDL created by Apache Axis version: 1.3
> > > > Built on Oct 05, 2005 (05:23:37 EDT)-->
> > > > <wsdl:types>
> > > > <schema
> xmlns="http://www.w3.org/2001/XMLSchema"
> > > > targetNamespace="http://services.spx.com">
> > > > <import
> > > >
> > >
> >
>
namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
> > > > <complexType name="TestException">
> > > > <sequence>
> > > > <element name="someError" nillable="true"
> type="xsd:string"/>
> > > > </sequence>
> > > > </complexType>
> > > > </schema>
> > > > </wsdl:types>
> > > > <wsdl:message name="TestException">
> > > > <wsdl:part name="fault"
> > > > type="impl:TestException"/>
> > > > </wsdl:message>
> > > > <wsdl:message name="throwErrorRequest">
>
=== message truncated ===
__________________________________________________
Do You Yahoo!?
Tired of spam? Yahoo! Mail has the best spam protection around
http://mail.yahoo.com
---------------------------------------------------------------------
To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-user-help@ws.apache.org
RE: Question about handling custom exceptions in Axis 1.3
Posted by Derek <de...@crc-corp.com>.
In general, you cannot send arbitrary exceptions to remote clients, since
Axis (or most other client/server communication protocols) has no idea how
to serialize/deserialize an arbitrary exception that you might have created
so that it can be transmitted to a remote client. You should probably only
be sending subclasses of RemoteException, and probably should include very
limited, if any, additional information in the exception class itself. I
suggest that you make sure that your TestException extends RemoteException,
not just Exception.
I am not sure how this works if a RemoteException has a 'cause' field which
is not a RemoteException. I am not an expert in what RemoteException is
capable of, but I think I know enough to understand that what you are trying
to do (throw an exception that is not derived from RemoteException from
server to client) is not, in general, possible.
Derek
> -----Original Message-----
> From: Eric Borisow [mailto:eborisow@yahoo.com]
> Sent: Thursday, August 03, 2006 6:33 AM
> To: axis-user@ws.apache.org
> Subject: Re: Question about handling custom exceptions in Axis 1.3
>
>
> I tried using this line:
>
> TestException myEx = (TestException) gbe;
>
> But, it won't even compile. It gives me the error:
> Cannot cast from RemoteException to TestException. Is
> there something I am missing?
>
> Thanks,
> Eric
>
> --- xu cai <je...@gmail.com> wrote:
>
> > AxisFault extends from RemoteException, I think you
> > can simply cast
> > RemoteException to your customized exception. hope
> > it works.
> >
> > -jeff
> >
> >
> > On 8/3/06, Eric Borisow <eb...@yahoo.com> wrote:
> > >
> > > Hi,
> > >
> > > I have been trying to piece together the best way
> > to
> > > generate and consume a custom exception with Axis
> > > 1_3. I have created a test with an interface, a
> > > service implementation of the interface and an
> > > Exception.
> > >
> > > When I generate the wsdl using java2wsdl, the wsdl
> > > contains a reference to the TestException class as
> > a
> > > fault of the service. When I call the service, it
> > > returns an AxisFault containing information about
> > the
> > > fault. My question is... what can I do with that
> RemoteException to
> > > get my exception out of it? I
> > have
> > > seen some other articles where it seems you should
> > > just be able to catch your custom exception but
> > all I
> > > ever get is RemoteException which I then have to
> > > convert to an AxisFault but I still don't get
> > access
> > > to my exception per se. See below for my code.
> > >
> > > Thanks,
> > > Eric
> > >
> > > Interface:
> > >
> > > public interface IServiceTest
> > > {
> > > public void throwError() throws TestException;
> > > }
> > >
> > > Service implementation:
> > >
> > > public class Service implements IServiceTest
> > > {
> > >
> > > public void throwError() throws TestException
> > > {
> > > throw new TestException();
> > > }
> > >
> > > }
> > >
> > > Exception:
> > >
> > > import java.io.Serializable;
> > >
> > > public class TestException extends Exception
> > > implements Serializable
> > > {
> > > private String someError;
> > >
> > > public TestException() {}
> > >
> > > public TestException(String someError)
> > > {
> > > this.someError = someError;
> > > }
> > >
> > > public String getSomeError()
> > > {
> > > return someError;
> > > }
> > >
> > > public void setSomeError(String someError)
> > > {
> > > this.someError = someError;
> > > }
> > >
> > >
> > > }
> > >
> > > wsdl:
> > >
> > > <?xml version="1.0" encoding="UTF-8"?>
> > > <wsdl:definitions
> > > targetNamespace="http://services.spx.com"
> > > xmlns:impl="http://services.spx.com"
> > > xmlns:intf="http://services.spx.com"
> > > xmlns:apachesoap="http://xml.apache.org/xml-soap"
> > >
> >
> xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
> > >
> >
> xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
> > > xmlns:xsd="http://www.w3.org/2001/XMLSchema"
> > > xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
> > > <!--WSDL created by Apache Axis version: 1.3
> > > Built on Oct 05, 2005 (05:23:37 EDT)-->
> > > <wsdl:types>
> > > <schema xmlns="http://www.w3.org/2001/XMLSchema"
> > > targetNamespace="http://services.spx.com">
> > > <import
> > >
> >
> namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
> > > <complexType name="TestException">
> > > <sequence>
> > > <element name="someError" nillable="true" type="xsd:string"/>
> > > </sequence>
> > > </complexType>
> > > </schema>
> > > </wsdl:types>
> > > <wsdl:message name="TestException">
> > > <wsdl:part name="fault"
> > > type="impl:TestException"/>
> > > </wsdl:message>
> > > <wsdl:message name="throwErrorRequest">
> > > </wsdl:message>
> > > <wsdl:message name="throwErrorResponse">
> > > </wsdl:message>
> > > <wsdl:portType name="Service">
> > > <wsdl:operation name="throwError">
> > > <wsdl:input name="throwErrorRequest"
> > > message="impl:throwErrorRequest"/>
> > > <wsdl:output name="throwErrorResponse"
> > > message="impl:throwErrorResponse"/>
> > > <wsdl:fault name="TestException"
> > > message="impl:TestException"/>
> > > </wsdl:operation>
> > > </wsdl:portType>
> > > <wsdl:binding
> > name="axisexceptiontestSoapBinding"
> > > type="impl:Service">
> > > <wsdlsoap:binding style="rpc"
> > > transport="http://schemas.xmlsoap.org/soap/http"/>
> > > <wsdl:operation name="throwError">
> > > <wsdlsoap:operation soapAction=""/>
> > > <wsdl:input name="throwErrorRequest">
> > > <wsdlsoap:body use="encoded"
> > >
> >
> encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
> > > namespace="http://services.spx.com"/>
> > > </wsdl:input>
> > > <wsdl:output name="throwErrorResponse">
> > > <wsdlsoap:body use="encoded"
> > >
> >
> encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
> > > namespace="http://services.spx.com"/>
> > > </wsdl:output>
> > > <wsdl:fault name="TestException">
> > > <wsdlsoap:fault name="TestException" use="encoded"
> > >
> >
> encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
> > > namespace="http://services.spx.com"/>
> > > </wsdl:fault>
> > > </wsdl:operation>
> > > </wsdl:binding>
> > > <wsdl:service name="ServiceService">
> > > <wsdl:port name="axisexceptiontest"
> > > binding="impl:axisexceptiontestSoapBinding">
> > > <wsdlsoap:address
> > > location="
> > >
> >
> http://localhost:7080/axisexceptiontest/services/axisexceptiontest"/>
> > > </wsdl:port>
> > > </wsdl:service>
> > > </wsdl:definitions>
> > >
> > > And finally, the text client code:
> > >
> > > import java.io.StringWriter;
> > > import java.rmi.RemoteException;
> > >
> > > import javax.xml.namespace.QName;
> > > import javax.xml.rpc.soap.SOAPFaultException;
> > >
> > > import org.apache.axis.AxisFault;
> > > import org.apache.axis.client.Call;
> > > import org.apache.axis.client.Service;
> > > import org.apache.xml.serialize.OutputFormat;
> > > import org.apache.xml.serialize.XMLSerializer;
> > > import org.w3c.dom.Document;
> > > import org.w3c.dom.Element;
> > >
> > > public class ManualServiceTest
> > > {
> > >
> > > /**
> > > * @param args
> > > */
> > > public static void main(String[] args)
> > > {
> > > try
> > > {
> > > Service service = new Service();
> >
> === message truncated ===
>
>
> __________________________________________________
> Do You Yahoo!?
> Tired of spam? Yahoo! Mail has the best spam protection around
> http://mail.yahoo.com
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
> For additional commands, e-mail: axis-user-help@ws.apache.org
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-user-help@ws.apache.org
Re: Question about handling custom exceptions in Axis 1.3
Posted by Eric Borisow <eb...@yahoo.com>.
I tried using this line:
TestException myEx = (TestException) gbe;
But, it won't even compile. It gives me the error:
Cannot cast from RemoteException to TestException. Is
there something I am missing?
Thanks,
Eric
--- xu cai <je...@gmail.com> wrote:
> AxisFault extends from RemoteException, I think you
> can simply cast
> RemoteException to your customized exception. hope
> it works.
>
> -jeff
>
>
> On 8/3/06, Eric Borisow <eb...@yahoo.com> wrote:
> >
> > Hi,
> >
> > I have been trying to piece together the best way
> to
> > generate and consume a custom exception with Axis
> > 1_3. I have created a test with an interface, a
> > service implementation of the interface and an
> > Exception.
> >
> > When I generate the wsdl using java2wsdl, the wsdl
> > contains a reference to the TestException class as
> a
> > fault of the service. When I call the service, it
> > returns an AxisFault containing information about
> the
> > fault. My question is... what can I do with that
> > RemoteException to get my exception out of it? I
> have
> > seen some other articles where it seems you should
> > just be able to catch your custom exception but
> all I
> > ever get is RemoteException which I then have to
> > convert to an AxisFault but I still don't get
> access
> > to my exception per se. See below for my code.
> >
> > Thanks,
> > Eric
> >
> > Interface:
> >
> > public interface IServiceTest
> > {
> > public void throwError() throws TestException;
> > }
> >
> > Service implementation:
> >
> > public class Service implements IServiceTest
> > {
> >
> > public void throwError() throws TestException
> > {
> > throw new TestException();
> > }
> >
> > }
> >
> > Exception:
> >
> > import java.io.Serializable;
> >
> > public class TestException extends Exception
> > implements Serializable
> > {
> > private String someError;
> >
> > public TestException() {}
> >
> > public TestException(String someError)
> > {
> > this.someError = someError;
> > }
> >
> > public String getSomeError()
> > {
> > return someError;
> > }
> >
> > public void setSomeError(String someError)
> > {
> > this.someError = someError;
> > }
> >
> >
> > }
> >
> > wsdl:
> >
> > <?xml version="1.0" encoding="UTF-8"?>
> > <wsdl:definitions
> > targetNamespace="http://services.spx.com"
> > xmlns:impl="http://services.spx.com"
> > xmlns:intf="http://services.spx.com"
> > xmlns:apachesoap="http://xml.apache.org/xml-soap"
> >
>
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
> >
>
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
> > xmlns:xsd="http://www.w3.org/2001/XMLSchema"
> > xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
> > <!--WSDL created by Apache Axis version: 1.3
> > Built on Oct 05, 2005 (05:23:37 EDT)-->
> > <wsdl:types>
> > <schema xmlns="http://www.w3.org/2001/XMLSchema"
> > targetNamespace="http://services.spx.com">
> > <import
> >
>
namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
> > <complexType name="TestException">
> > <sequence>
> > <element name="someError" nillable="true"
> > type="xsd:string"/>
> > </sequence>
> > </complexType>
> > </schema>
> > </wsdl:types>
> > <wsdl:message name="TestException">
> > <wsdl:part name="fault"
> > type="impl:TestException"/>
> > </wsdl:message>
> > <wsdl:message name="throwErrorRequest">
> > </wsdl:message>
> > <wsdl:message name="throwErrorResponse">
> > </wsdl:message>
> > <wsdl:portType name="Service">
> > <wsdl:operation name="throwError">
> > <wsdl:input name="throwErrorRequest"
> > message="impl:throwErrorRequest"/>
> > <wsdl:output name="throwErrorResponse"
> > message="impl:throwErrorResponse"/>
> > <wsdl:fault name="TestException"
> > message="impl:TestException"/>
> > </wsdl:operation>
> > </wsdl:portType>
> > <wsdl:binding
> name="axisexceptiontestSoapBinding"
> > type="impl:Service">
> > <wsdlsoap:binding style="rpc"
> > transport="http://schemas.xmlsoap.org/soap/http"/>
> > <wsdl:operation name="throwError">
> > <wsdlsoap:operation soapAction=""/>
> > <wsdl:input name="throwErrorRequest">
> > <wsdlsoap:body use="encoded"
> >
>
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
> > namespace="http://services.spx.com"/>
> > </wsdl:input>
> > <wsdl:output name="throwErrorResponse">
> > <wsdlsoap:body use="encoded"
> >
>
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
> > namespace="http://services.spx.com"/>
> > </wsdl:output>
> > <wsdl:fault name="TestException">
> > <wsdlsoap:fault name="TestException"
> > use="encoded"
> >
>
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
> > namespace="http://services.spx.com"/>
> > </wsdl:fault>
> > </wsdl:operation>
> > </wsdl:binding>
> > <wsdl:service name="ServiceService">
> > <wsdl:port name="axisexceptiontest"
> > binding="impl:axisexceptiontestSoapBinding">
> > <wsdlsoap:address
> > location="
> >
>
http://localhost:7080/axisexceptiontest/services/axisexceptiontest"/>
> > </wsdl:port>
> > </wsdl:service>
> > </wsdl:definitions>
> >
> > And finally, the text client code:
> >
> > import java.io.StringWriter;
> > import java.rmi.RemoteException;
> >
> > import javax.xml.namespace.QName;
> > import javax.xml.rpc.soap.SOAPFaultException;
> >
> > import org.apache.axis.AxisFault;
> > import org.apache.axis.client.Call;
> > import org.apache.axis.client.Service;
> > import org.apache.xml.serialize.OutputFormat;
> > import org.apache.xml.serialize.XMLSerializer;
> > import org.w3c.dom.Document;
> > import org.w3c.dom.Element;
> >
> > public class ManualServiceTest
> > {
> >
> > /**
> > * @param args
> > */
> > public static void main(String[] args)
> > {
> > try
> > {
> > Service service = new Service();
>
=== message truncated ===
__________________________________________________
Do You Yahoo!?
Tired of spam? Yahoo! Mail has the best spam protection around
http://mail.yahoo.com
---------------------------------------------------------------------
To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-user-help@ws.apache.org
Re: Question about handling custom exceptions in Axis 1.3
Posted by xu cai <je...@gmail.com>.
AxisFault extends from RemoteException, I think you can simply cast
RemoteException to your customized exception. hope it works.
-jeff
On 8/3/06, Eric Borisow <eb...@yahoo.com> wrote:
>
> Hi,
>
> I have been trying to piece together the best way to
> generate and consume a custom exception with Axis
> 1_3. I have created a test with an interface, a
> service implementation of the interface and an
> Exception.
>
> When I generate the wsdl using java2wsdl, the wsdl
> contains a reference to the TestException class as a
> fault of the service. When I call the service, it
> returns an AxisFault containing information about the
> fault. My question is... what can I do with that
> RemoteException to get my exception out of it? I have
> seen some other articles where it seems you should
> just be able to catch your custom exception but all I
> ever get is RemoteException which I then have to
> convert to an AxisFault but I still don't get access
> to my exception per se. See below for my code.
>
> Thanks,
> Eric
>
> Interface:
>
> public interface IServiceTest
> {
> public void throwError() throws TestException;
> }
>
> Service implementation:
>
> public class Service implements IServiceTest
> {
>
> public void throwError() throws TestException
> {
> throw new TestException();
> }
>
> }
>
> Exception:
>
> import java.io.Serializable;
>
> public class TestException extends Exception
> implements Serializable
> {
> private String someError;
>
> public TestException() {}
>
> public TestException(String someError)
> {
> this.someError = someError;
> }
>
> public String getSomeError()
> {
> return someError;
> }
>
> public void setSomeError(String someError)
> {
> this.someError = someError;
> }
>
>
> }
>
> wsdl:
>
> <?xml version="1.0" encoding="UTF-8"?>
> <wsdl:definitions
> targetNamespace="http://services.spx.com"
> xmlns:impl="http://services.spx.com"
> xmlns:intf="http://services.spx.com"
> xmlns:apachesoap="http://xml.apache.org/xml-soap"
> xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
> xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
> xmlns:xsd="http://www.w3.org/2001/XMLSchema"
> xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
> <!--WSDL created by Apache Axis version: 1.3
> Built on Oct 05, 2005 (05:23:37 EDT)-->
> <wsdl:types>
> <schema xmlns="http://www.w3.org/2001/XMLSchema"
> targetNamespace="http://services.spx.com">
> <import
> namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
> <complexType name="TestException">
> <sequence>
> <element name="someError" nillable="true"
> type="xsd:string"/>
> </sequence>
> </complexType>
> </schema>
> </wsdl:types>
> <wsdl:message name="TestException">
> <wsdl:part name="fault"
> type="impl:TestException"/>
> </wsdl:message>
> <wsdl:message name="throwErrorRequest">
> </wsdl:message>
> <wsdl:message name="throwErrorResponse">
> </wsdl:message>
> <wsdl:portType name="Service">
> <wsdl:operation name="throwError">
> <wsdl:input name="throwErrorRequest"
> message="impl:throwErrorRequest"/>
> <wsdl:output name="throwErrorResponse"
> message="impl:throwErrorResponse"/>
> <wsdl:fault name="TestException"
> message="impl:TestException"/>
> </wsdl:operation>
> </wsdl:portType>
> <wsdl:binding name="axisexceptiontestSoapBinding"
> type="impl:Service">
> <wsdlsoap:binding style="rpc"
> transport="http://schemas.xmlsoap.org/soap/http"/>
> <wsdl:operation name="throwError">
> <wsdlsoap:operation soapAction=""/>
> <wsdl:input name="throwErrorRequest">
> <wsdlsoap:body use="encoded"
> encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
> namespace="http://services.spx.com"/>
> </wsdl:input>
> <wsdl:output name="throwErrorResponse">
> <wsdlsoap:body use="encoded"
> encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
> namespace="http://services.spx.com"/>
> </wsdl:output>
> <wsdl:fault name="TestException">
> <wsdlsoap:fault name="TestException"
> use="encoded"
> encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
> namespace="http://services.spx.com"/>
> </wsdl:fault>
> </wsdl:operation>
> </wsdl:binding>
> <wsdl:service name="ServiceService">
> <wsdl:port name="axisexceptiontest"
> binding="impl:axisexceptiontestSoapBinding">
> <wsdlsoap:address
> location="
> http://localhost:7080/axisexceptiontest/services/axisexceptiontest"/>
> </wsdl:port>
> </wsdl:service>
> </wsdl:definitions>
>
> And finally, the text client code:
>
> import java.io.StringWriter;
> import java.rmi.RemoteException;
>
> import javax.xml.namespace.QName;
> import javax.xml.rpc.soap.SOAPFaultException;
>
> import org.apache.axis.AxisFault;
> import org.apache.axis.client.Call;
> import org.apache.axis.client.Service;
> import org.apache.xml.serialize.OutputFormat;
> import org.apache.xml.serialize.XMLSerializer;
> import org.w3c.dom.Document;
> import org.w3c.dom.Element;
>
> public class ManualServiceTest
> {
>
> /**
> * @param args
> */
> public static void main(String[] args)
> {
> try
> {
> Service service = new Service();
> Call call = (Call)
> service.createCall();
> String endpointURL =
> "http://localhost:81/axisexceptiontest/services/axisexceptiontest";
>
> call.setTargetEndpointAddress( new
> java.net.URL(endpointURL) );
> call.setOperationName( new
> QName("urn:axisexceptiontest", "throwError") );
>
> // Integer response = (Integer)
> call.invoke( new Object[] { TestException,
> "ldapTestException" } );
> call.invoke(new Object[] { });
> }catch(SOAPFaultException fault){
> fault.printStackTrace();
>
> System.out.println("Fault Detail : "+
> fault.getDetail());
> System.out.println("Fault Actor : "+
> fault.getFaultActor());
> System.out.println("Fault String: "+
> fault.getFaultString());
> } catch (RemoteException gbe) {
> System.out.println(gbe.toString());
> gbe.printStackTrace();
> System.out.println("Class of exception is:
> " + gbe.getClass().getName());
> if (gbe instanceof AxisFault)
> {
> System.out.println("Exception is an
> Axis Fault");
> AxisFault fault = (AxisFault) gbe;
> System.out.println("Fault reason is:
> ");
>
> System.out.println(fault.getFaultReason());
> System.out.println("Fault string is:
> ");
>
> System.out.println(fault.getFaultString());
>
> System.out.println("Fault Actor : "+
> fault.getFaultActor());
> System.out.println("Fault String: "+
> fault.getFaultString());
>
> try
> {
> Element[] detail =
> fault.getFaultDetails();
> for (int i=0; i<detail.length;
> i++)
> System.out.println(
>
> documentToString(detail[i].getOwnerDocument()));
> }
> catch (Exception e)
> {
> e.printStackTrace();
> }
> }
> } catch (Exception e) {
> System.out.println(e.toString());
> e.printStackTrace();
> System.out.println("Class of exception is:
> " + e.getClass().getName());
> }
>
> }
>
> static String documentToString(Document doc)
> throws Exception {
>
> OutputFormat format = new OutputFormat( doc );
>
> StringWriter stringOut = new StringWriter();
> XMLSerializer serial = new XMLSerializer(
> stringOut, format );
>
> serial.asDOMSerializer();
> serial.serialize( doc.getDocumentElement() );
> return stringOut.toString();
> }
>
> }
>
> __________________________________________________
> Do You Yahoo!?
> Tired of spam? Yahoo! Mail has the best spam protection around
> http://mail.yahoo.com
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
> For additional commands, e-mail: axis-user-help@ws.apache.org
>
>
--
- xucai