Hi,
I'm curious as to why the Digester code always tries to use the thread's
classloader:
ClassLoader ctxLoader = Thread.currentThread().getContextClassLoader();
if (ctxLoader == null) {
paramTypes[0] =
Class.forName(paramType);
} else {
paramTypes[0]
=
ctxLoader.loadClass(paramType);
}
I'm pretty ignorant of classloaders in general. If anyone has pointers on this
subject, perhaps suggesting why the above is needed, it would be appreciated.
The reason I'm asking is because when I use Digester from within a
servlet, it fails silently. I have (laboriously) traced the problem down to the
fact that Digester uses the thread's classloader. If I remove the above checks,
and just have Class.forName(), my code (as follows) works:
Digester digester = new Digester();
digester.push(this); // note: "this" is the servlet
digester.setDebug(9);
digester.setValidating(false);
// set rules
digester.addObjectCreate("services/service",
"net.socialchange.bob.AbstractService"); // this fails silently
digester.addSetProperties("services/service");
digester.addSetNext("services/service", "addService",
"net.socialchange.bob.Service"); // as does this
// do parse
My XML is:
<services>
<service name="Service 1" URL="http://localhost:8090/bob3/serv1.jsp"/>
<service name="Service 2" URL="/serv2.jsp"/>
</services>
I'm using tc3.2.2b5, jdk1.3, no securitymanager, latest Digester from CVS.
If this sounds like a bug (in tomcat or Digester), rather than my ignorance,
I'll make a test case and file a proper bug report.
thanks,
--Jeff