You are viewing a plain text version of this content. The canonical link for it is here.
Posted to soap-user@xml.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)