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)