You are viewing a plain text version of this content. The canonical link for it is here.
Posted to soap-user@ws.apache.org by Kris Dosch <kd...@mn.rr.com> on 2001/08/15 00:27:43 UTC

Custom Fault Handlers

I am experimenting with writing my own fault handler.  I have a simple
HelloWorld service with a method that throws an exception.  I created a
class called MyFaultListener which implements SOAPFaultListener.  For now,
the fault() method code is identical to that in DOMFaultListener.

If I deploy the service with either of Apache's basic fault handlers
(DOMFaultListener or ExceptionFaultListener), it works fine.  If I deploy
with my fault handler, Tomcat throws the following exception:

java.lang.NoClassDefFoundError: org/apache/soap/server/SOAPFaultListener

It seems like a classpath problem, but why would it be able to find
SOAPFaultListener if the fault handler is DOMFaultListener but not
MyFaultListener?  They are identical except for the class name.  In fact, I
can deploy with all three fault handlers in the deployment descriptor, and
it blows up only when trying to load MyFaultListener (I added debug code to
SOAPContext.java).

I am using Tomcat version 3.3-m3, and soap.jar is in TOMCAT_HOME\lib\apps
directory.

Any insight would be appreciated.
Thanks!


Here's the complete stack trace spit out by Tomcat:

2001-08-14 15:35:58 - Ctx(/soap) : Exception in R( /soap +
/servlet/rpcrouter + null) - java.lang.NoClassDefFoundError:
org/apache/soap/server/SOAPFaultListener
        at java.lang.ClassLoader.defineClass0(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java, Compiled
Code)
        at
java.security.SecureClassLoader.defineClass(SecureClassLoader.java, Compiled
Code)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java, Compiled
Code)
        at java.net.URLClassLoader.access$1(URLClassLoader.java, Compiled
Code)
        at java.net.URLClassLoader$1.run(URLClassLoader.java, Compiled Code)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java, Compiled
Code)
        at java.lang.ClassLoader.loadClass(ClassLoader.java, Compiled Code)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java,
Compiled Code)
        at java.lang.ClassLoader.loadClass(ClassLoader.java, Compiled Code)
        at java.net.FactoryURLClassLoader.loadClass(URLClassLoader.java,
Compiled Code)
        at java.lang.ClassLoader.loadClass(ClassLoader.java, Compiled Code)
        at java.net.FactoryURLClassLoader.loadClass(URLClassLoader.java,
Compiled Code)
        at java.lang.ClassLoader.loadClass(ClassLoader.java, Compiled Code)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java,
Compiled Code)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:199)
        at org.apache.soap.rpc.SOAPContext.loadClass(SOAPContext.java:564)
        at
org.apache.soap.server.DeploymentDescriptor.buildFaultRouter(DeploymentDescr
iptor.java, Compiled Code)
        at
org.apache.soap.server.http.RPCRouterServlet.doPost(RPCRouterServlet.java,
Compiled Code)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java)
        at
org.apache.tomcat.facade.ServletHandler.doService(ServletHandler.java:500)
        at org.apache.tomcat.core.Handler.service(Handler.java, Compiled
Code)
        at
org.apache.tomcat.facade.ServletHandler.service(ServletHandler.java:448)
        at
org.apache.tomcat.core.ContextManager.internalService(ContextManager.java,
Compiled Code)
        at
org.apache.tomcat.core.ContextManager.service(ContextManager.java, Compiled
Code)
        at
org.apache.tomcat.modules.server.Http10Interceptor.processConnection(Http10I
nterceptor.java:150)
        at
org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java,
Compiled Code)
        at
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.jav
a, Compiled Code)
        at java.lang.Thread.run(Thread.java:479)



RE: Custom Fault Handlers

Posted by Kris Dosch <kd...@mn.rr.com>.
For those interested, I think I've located the source of this problem, as
well as a workaround.

It has to do with class loaders and an unhandled exception.  In
DeploymentDescriptor.buildFaultRouter(), the call to SOAPContext.loadClass()
throws a NoClassDefFoundError.  Reflection revealed that the
SOAPFaultListener Class object on MyFaultListener (obtained through
MyFaultListener.getInterfaces()) was not the same Class object as
SOAPFaultListener.class, indicating a classloader problem.
buildFaultRouter() catches this exception and ignores it, leaving a null in
the array of listeners, which results in a NullPointerException being thrown
later on by SOAPFaultRouter.notifyListeners().

In trying to locate the source of this problem, I have upgraded to Tomcat
4.0b7 and JDK1.3.

The solution: I had defined CLASSPATH in catalina.bat to include the soap
jar files (xerces, soap, mail, activation) as well as the path to my
development directory.  When I removed that and put the soap jars in
CATALINA_HOME\webapps\soap\WEB-INF\lib and my class files in
CATALINA_HOME\webapps\soap\WEB-INF\classes, everything works as expected
with MyFaultListener.fault() being called properly.

I'm not sure if this was a server configuration issue on my part, or if it's
a problem with the way class loaders work in the SOAP code.

-Kris


-----Original Message-----
From: Kris Dosch [mailto:kdosch@mn.rr.com]
Sent: Tuesday, August 14, 2001 5:28 PM
To: soap-user@xml.apache.org
Subject: Custom Fault Handlers


I am experimenting with writing my own fault handler.  I have a simple
HelloWorld service with a method that throws an exception.  I created a
class called MyFaultListener which implements SOAPFaultListener.  For now,
the fault() method code is identical to that in DOMFaultListener.

If I deploy the service with either of Apache's basic fault handlers
(DOMFaultListener or ExceptionFaultListener), it works fine.  If I deploy
with my fault handler, Tomcat throws the following exception:

java.lang.NoClassDefFoundError: org/apache/soap/server/SOAPFaultListener

It seems like a classpath problem, but why would it be able to find
SOAPFaultListener if the fault handler is DOMFaultListener but not
MyFaultListener?  They are identical except for the class name.  In fact, I
can deploy with all three fault handlers in the deployment descriptor, and
it blows up only when trying to load MyFaultListener (I added debug code to
SOAPContext.java).

I am using Tomcat version 3.3-m3, and soap.jar is in TOMCAT_HOME\lib\apps
directory.

Any insight would be appreciated.
Thanks!


Here's the complete stack trace spit out by Tomcat:

2001-08-14 15:35:58 - Ctx(/soap) : Exception in R( /soap +
/servlet/rpcrouter + null) - java.lang.NoClassDefFoundError:
org/apache/soap/server/SOAPFaultListener
        at java.lang.ClassLoader.defineClass0(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java, Compiled
Code)
        at
java.security.SecureClassLoader.defineClass(SecureClassLoader.java, Compiled
Code)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java, Compiled
Code)
        at java.net.URLClassLoader.access$1(URLClassLoader.java, Compiled
Code)
        at java.net.URLClassLoader$1.run(URLClassLoader.java, Compiled Code)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java, Compiled
Code)
        at java.lang.ClassLoader.loadClass(ClassLoader.java, Compiled Code)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java,
Compiled Code)
        at java.lang.ClassLoader.loadClass(ClassLoader.java, Compiled Code)
        at java.net.FactoryURLClassLoader.loadClass(URLClassLoader.java,
Compiled Code)
        at java.lang.ClassLoader.loadClass(ClassLoader.java, Compiled Code)
        at java.net.FactoryURLClassLoader.loadClass(URLClassLoader.java,
Compiled Code)
        at java.lang.ClassLoader.loadClass(ClassLoader.java, Compiled Code)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java,
Compiled Code)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:199)
        at org.apache.soap.rpc.SOAPContext.loadClass(SOAPContext.java:564)
        at
org.apache.soap.server.DeploymentDescriptor.buildFaultRouter(DeploymentDescr
iptor.java, Compiled Code)
        at
org.apache.soap.server.http.RPCRouterServlet.doPost(RPCRouterServlet.java,
Compiled Code)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java)
        at
org.apache.tomcat.facade.ServletHandler.doService(ServletHandler.java:500)
        at org.apache.tomcat.core.Handler.service(Handler.java, Compiled
Code)
        at
org.apache.tomcat.facade.ServletHandler.service(ServletHandler.java:448)
        at
org.apache.tomcat.core.ContextManager.internalService(ContextManager.java,
Compiled Code)
        at
org.apache.tomcat.core.ContextManager.service(ContextManager.java, Compiled
Code)
        at
org.apache.tomcat.modules.server.Http10Interceptor.processConnection(Http10I
nterceptor.java:150)
        at
org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java,
Compiled Code)
        at
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.jav
a, Compiled Code)
        at java.lang.Thread.run(Thread.java:479)



RE: Custom Fault Handlers

Posted by Kris Dosch <kd...@mn.rr.com>.
For those interested, I think I've located the source of this problem, as
well as a workaround.

It has to do with class loaders and an unhandled exception.  In
DeploymentDescriptor.buildFaultRouter(), the call to SOAPContext.loadClass()
throws a NoClassDefFoundError.  Reflection revealed that the
SOAPFaultListener Class object on MyFaultListener (obtained through
MyFaultListener.getInterfaces()) was not the same Class object as
SOAPFaultListener.class, indicating a classloader problem.
buildFaultRouter() catches this exception and ignores it, leaving a null in
the array of listeners, which results in a NullPointerException being thrown
later on by SOAPFaultRouter.notifyListeners().

In trying to locate the source of this problem, I have upgraded to Tomcat
4.0b7 and JDK1.3.

The solution: I had defined CLASSPATH in catalina.bat to include the soap
jar files (xerces, soap, mail, activation) as well as the path to my
development directory.  When I removed that and put the soap jars in
CATALINA_HOME\webapps\soap\WEB-INF\lib and my class files in
CATALINA_HOME\webapps\soap\WEB-INF\classes, everything works as expected
with MyFaultListener.fault() being called properly.

I'm not sure if this was a server configuration issue on my part, or if it's
a problem with the way class loaders work in the SOAP code.

-Kris


-----Original Message-----
From: Kris Dosch [mailto:kdosch@mn.rr.com]
Sent: Tuesday, August 14, 2001 5:28 PM
To: soap-user@xml.apache.org
Subject: Custom Fault Handlers


I am experimenting with writing my own fault handler.  I have a simple
HelloWorld service with a method that throws an exception.  I created a
class called MyFaultListener which implements SOAPFaultListener.  For now,
the fault() method code is identical to that in DOMFaultListener.

If I deploy the service with either of Apache's basic fault handlers
(DOMFaultListener or ExceptionFaultListener), it works fine.  If I deploy
with my fault handler, Tomcat throws the following exception:

java.lang.NoClassDefFoundError: org/apache/soap/server/SOAPFaultListener

It seems like a classpath problem, but why would it be able to find
SOAPFaultListener if the fault handler is DOMFaultListener but not
MyFaultListener?  They are identical except for the class name.  In fact, I
can deploy with all three fault handlers in the deployment descriptor, and
it blows up only when trying to load MyFaultListener (I added debug code to
SOAPContext.java).

I am using Tomcat version 3.3-m3, and soap.jar is in TOMCAT_HOME\lib\apps
directory.

Any insight would be appreciated.
Thanks!


Here's the complete stack trace spit out by Tomcat:

2001-08-14 15:35:58 - Ctx(/soap) : Exception in R( /soap +
/servlet/rpcrouter + null) - java.lang.NoClassDefFoundError:
org/apache/soap/server/SOAPFaultListener
        at java.lang.ClassLoader.defineClass0(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java, Compiled
Code)
        at
java.security.SecureClassLoader.defineClass(SecureClassLoader.java, Compiled
Code)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java, Compiled
Code)
        at java.net.URLClassLoader.access$1(URLClassLoader.java, Compiled
Code)
        at java.net.URLClassLoader$1.run(URLClassLoader.java, Compiled Code)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java, Compiled
Code)
        at java.lang.ClassLoader.loadClass(ClassLoader.java, Compiled Code)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java,
Compiled Code)
        at java.lang.ClassLoader.loadClass(ClassLoader.java, Compiled Code)
        at java.net.FactoryURLClassLoader.loadClass(URLClassLoader.java,
Compiled Code)
        at java.lang.ClassLoader.loadClass(ClassLoader.java, Compiled Code)
        at java.net.FactoryURLClassLoader.loadClass(URLClassLoader.java,
Compiled Code)
        at java.lang.ClassLoader.loadClass(ClassLoader.java, Compiled Code)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java,
Compiled Code)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:199)
        at org.apache.soap.rpc.SOAPContext.loadClass(SOAPContext.java:564)
        at
org.apache.soap.server.DeploymentDescriptor.buildFaultRouter(DeploymentDescr
iptor.java, Compiled Code)
        at
org.apache.soap.server.http.RPCRouterServlet.doPost(RPCRouterServlet.java,
Compiled Code)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java)
        at
org.apache.tomcat.facade.ServletHandler.doService(ServletHandler.java:500)
        at org.apache.tomcat.core.Handler.service(Handler.java, Compiled
Code)
        at
org.apache.tomcat.facade.ServletHandler.service(ServletHandler.java:448)
        at
org.apache.tomcat.core.ContextManager.internalService(ContextManager.java,
Compiled Code)
        at
org.apache.tomcat.core.ContextManager.service(ContextManager.java, Compiled
Code)
        at
org.apache.tomcat.modules.server.Http10Interceptor.processConnection(Http10I
nterceptor.java:150)
        at
org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java,
Compiled Code)
        at
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.jav
a, Compiled Code)
        at java.lang.Thread.run(Thread.java:479)