I am trying to use my own RequestHelper, RequestHelperFactory, and Href implementation to make each link call a Javascript function (I recently found out that I might be able to solve the problem by using paging.banner.page.link property, but would like to know the answer to this anyhow...). I use a .war packet for my application:
but, when page tries to get drawn, I get a class loading problem:
java.lang.NoClassDefFoundError: org/displaytag/util/RequestHelperFactory
at java.lang.ClassLoader.defineClass0(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:537)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)
at weblogic.utils.classloaders.GenericClassLoader.findLocalClass(GenericClassLoader.java:476)
at weblogic.utils.classloaders.GenericClassLoader.findClass(GenericClassLoader.java:181)
at java.lang.ClassLoader.loadClass(ClassLoader.java:289)
at java.lang.ClassLoader.loadClass(ClassLoader.java:282)
at java.lang.ClassLoader.loadClass(ClassLoader.java:235)
at weblogic.utils.classloaders.GenericClassLoader.loadClass(GenericClassLoader.java:223)
at weblogic.utils.classloaders.ChangeAwareClassLoader.loadClass(ChangeAwareClassLoader.java:41)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:302)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:141)
at org.displaytag.util.ReflectHelper.classForName(ReflectHelper.java:43)
at org.displaytag.properties.TableProperties.getClassPropertyInstance(TableProperties.java:1078)
at org.displaytag.properties.TableProperties.getRequestHelperFactoryInstance(TableProperties.java:965)
at org.displaytag.tags.TableTag.initParameters(TableTag.java:731)
at org.displaytag.tags.TableTag.doStartTag(TableTag.java:620)
at org.displaytag.tags.el.ELTableTag.doStartTag(ELTableTag.java:320)
at jsp_servlet._some._page.__subpage._jspService(exceptions.jsp:56)
at weblogic.servlet.jsp.JspBase.service(JspBase.java:33)
at weblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run(ServletStubImpl.java:996)
at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:419)
at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:315)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:6452)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:118)
at weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletContext.java:3661)
at weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java:2630)
at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:219)
at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:178)
(using WebLogic 8.1 here). Actually that .war is still contained inside an .ear, but I do not see how that could affect the problem. Displaytag works fine as long as I do not use my own custom RequestHelper implementation.
I get the feeling that J2EE classloading is able to locate displaytag classes using displaytag.jar classloader, displaytag classes locate my custom requesthelper using their parent classloader (.war classloader), but my custom requesthelper classes do not see the displaytag classes, since .war classloader cannot see it's child classloader's (displaytag.jar classloader) classes. But I am not sure whether I got the picture correctly....
Any tips on how to properly use custom requesthelper implementations? Preferrably so, that I can keep my custom classes part of the .war classes and do not have to modify the displaytag distribution jar?
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
I am able to use a custom request helper packaged in the web-inf/classes folder (both in a war than in a ear archive) without problem in WebSphere, probably weblogic uses a different classloader policy for war libraries.
Anyway, your diagnosis seem correct: displaytag is able to load your custom request helper class but in some way your custom class can't find the interface in displaytag.jar. But jar libraries should be available to classes in WEB-INF classes, so this sounds a little strange... try checking weblogic documentation for a description of its classloader policy....
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
I am trying to use my own RequestHelper, RequestHelperFactory, and Href implementation to make each link call a Javascript function (I recently found out that I might be able to solve the problem by using paging.banner.page.link property, but would like to know the answer to this anyhow...). I use a .war packet for my application:
war:
WEB-INF\lib\displaytag-1.0-rc2.jar
WEB-INF\classes\com\some\display\MyRequestHelper.class
WEB-INF\classes\com\some\display\MyRequestHelperFactory.class
WEB-INF\classes\com\some\display\MyHref.class
META-INF\Manifest.mf: ...Class-Path: some.jar, displaytag-1.0-rc2.jar
WEB-INF\classes\displaytag.properties: ...factory.requestHelper=com.some.display.MyRequestHelperFactory.class
but, when page tries to get drawn, I get a class loading problem:
java.lang.NoClassDefFoundError: org/displaytag/util/RequestHelperFactory
at java.lang.ClassLoader.defineClass0(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:537)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)
at weblogic.utils.classloaders.GenericClassLoader.findLocalClass(GenericClassLoader.java:476)
at weblogic.utils.classloaders.GenericClassLoader.findClass(GenericClassLoader.java:181)
at java.lang.ClassLoader.loadClass(ClassLoader.java:289)
at java.lang.ClassLoader.loadClass(ClassLoader.java:282)
at java.lang.ClassLoader.loadClass(ClassLoader.java:235)
at weblogic.utils.classloaders.GenericClassLoader.loadClass(GenericClassLoader.java:223)
at weblogic.utils.classloaders.ChangeAwareClassLoader.loadClass(ChangeAwareClassLoader.java:41)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:302)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:141)
at org.displaytag.util.ReflectHelper.classForName(ReflectHelper.java:43)
at org.displaytag.properties.TableProperties.getClassPropertyInstance(TableProperties.java:1078)
at org.displaytag.properties.TableProperties.getRequestHelperFactoryInstance(TableProperties.java:965)
at org.displaytag.tags.TableTag.initParameters(TableTag.java:731)
at org.displaytag.tags.TableTag.doStartTag(TableTag.java:620)
at org.displaytag.tags.el.ELTableTag.doStartTag(ELTableTag.java:320)
at jsp_servlet._some._page.__subpage._jspService(exceptions.jsp:56)
at weblogic.servlet.jsp.JspBase.service(JspBase.java:33)
at weblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run(ServletStubImpl.java:996)
at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:419)
at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:315)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:6452)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:118)
at weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletContext.java:3661)
at weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java:2630)
at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:219)
at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:178)
(using WebLogic 8.1 here). Actually that .war is still contained inside an .ear, but I do not see how that could affect the problem. Displaytag works fine as long as I do not use my own custom RequestHelper implementation.
I get the feeling that J2EE classloading is able to locate displaytag classes using displaytag.jar classloader, displaytag classes locate my custom requesthelper using their parent classloader (.war classloader), but my custom requesthelper classes do not see the displaytag classes, since .war classloader cannot see it's child classloader's (displaytag.jar classloader) classes. But I am not sure whether I got the picture correctly....
Any tips on how to properly use custom requesthelper implementations? Preferrably so, that I can keep my custom classes part of the .war classes and do not have to modify the displaytag distribution jar?
I am able to use a custom request helper packaged in the web-inf/classes folder (both in a war than in a ear archive) without problem in WebSphere, probably weblogic uses a different classloader policy for war libraries.
Anyway, your diagnosis seem correct: displaytag is able to load your custom request helper class but in some way your custom class can't find the interface in displaytag.jar. But jar libraries should be available to classes in WEB-INF classes, so this sounds a little strange... try checking weblogic documentation for a description of its classloader policy....