[jira] Commented: (NANO-39) groovy scripted nanocontainer fails in servlet context
jira-yCVjj/[email protected] Sat, 14 Feb 2004 18:26:27 -0500 (EST)
| Newsgroups | gmane.comp.java.nanocontainer.devel |
|---|---|
| Message-ID | <[email protected]> |
The following comment has been added to this issue:
Author: Jacob Kjome
Created: Sat, 14 Feb 2004 6:25 PM
Body:
Ok, I think I've figured it out. The problem happens because the GroovyClassLoader is newly created each time and, somehow, the second time loading, there exists a reference in the GroovyClassLoader cache, a field named "nanocontainer.groovy" which has a "main" and "run" methods. Not sure which class that is. Well, that last part is speculation, but what fixes the issue is this...
Modfy the constructor from this....
public GroovyContainerBuilder(Reader script, ClassLoader classLoader) {
super(script, classLoader);
}
To this....
public GroovyContainerBuilder(Reader script, ClassLoader classLoader) {
super(script, new GroovyClassLoader(classLoader));
}
And then when we reference the classloader to use Groovy-specific mehods, we cast it to a GroovyClassLoader like this...
GroovyClassLoader loader = (GroovyClassLoader)classLoader;
This way, the GroovyClassLoader's "cache" field will continue to contain a reference to the pre-built script. I no longer get a "nanocontainer" class coming back after the first time the GroovyContainerBuilder.createContainer() is called. I get the DemoBuilder class defined in my script. Great!....of course now I've run into another issue. I get the following stack trace...
org.picocontainer.defaults.UnsatisfiableDependenciesException: java.lang.Class doesn't have any satisfiable constructors. Unsatisfiable dependencies: []
at org.picocontainer.defaults.ConstructorComponentAdapter.getAllSatisfiableConstructors(ConstructorComponentAdapter.java:117)
at org.picocontainer.defaults.ConstructorComponentAdapter.getGreediestSatisifableConstructor(ConstructorComponentAdapter.java:63)
at org.picocontainer.defaults.ConstructorComponentAdapter.getMostSatisfiableDependencyTypes(ConstructorComponentAdapter.java:57)
at org.picocontainer.defaults.InstantiatingComponentAdapter.getMostSatisifableDependencyAdapters(InstantiatingComponentAdapter.java:76)
at org.picocontainer.defaults.InstantiatingComponentAdapter.getComponentInstance(InstantiatingComponentAdapter.java:44)
at org.picocontainer.defaults.DecoratingComponentAdapter.getComponentInstance(DecoratingComponentAdapter.java:41)
at org.picocontainer.defaults.CachingComponentAdapter.getComponentInstance(CachingComponentAdapter.java:37)
at org.picocontainer.defaults.DefaultPicoContainer.getComponentInstance(DefaultPicoContainer.java:248)
at org.apache.jsp.index_jsp._jspService(index_jsp.java:58)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:133)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:311)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:301)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:248)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:284)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:204)
at org.nanocontainer.servlet.ServletRequestContainerFilter.doFilter(ServletRequestContainerFilter.java:37)
Here's my groovy script. Anyone see a problem with it????
import org.picoextras.servlet.sample.SomeRequestUtil
import org.picoextras.servlet.sample.SomeCounter
class DemoBuilder {
buildContainer(parent, compositionScope) {
pico = new org.picocontainer.defaults.DefaultPicoContainer(parent)
if (compositionScope instanceof javax.servlet.ServletRequest) {
pico.registerComponentImplementation("util", SomeRequestUtil.class)
}
else if (compositionScope instanceof javax.servlet.http.HttpSession) {
pico.registerComponentImplementation("counter", SomeCounter.class)
}
else if (compositionScope instanceof javax.servlet.ServletContext) {
}
else {
}
return pico
}
}
---------------------------------------------------------------------
View this comment:
http://jira.codehaus.org/secure/ViewIssue.jspa?key=NANO-39&page=comments#action_16751
---------------------------------------------------------------------
View the issue:
http://jira.codehaus.org/secure/ViewIssue.jspa?key=NANO-39
Here is an overview of the issue:
---------------------------------------------------------------------
Key: NANO-39
Summary: groovy scripted nanocontainer fails in servlet context
Type: Bug
Status: Unassigned
Priority: Major
Original Estimate: Unknown
Time Spent: Unknown
Remaining: Unknown
Project: NanoContainer
Components:
Core
Versions:
1.0-beta-1
Assignee:
Reporter: Jacob Kjome
Created: Fri, 13 Feb 2004 1:51 AM
Updated: Sat, 14 Feb 2004 6:25 PM
Environment: servlet container, scripting of nanocontainer done with Groovy
Description:
When setting up the nanocontainer servlet in web.xml using the context-param "nanocontainer.groovy", it only seems to work for the first container that is configured, or, the first compositionScope. If any other scope is provided such as a ServletRequest or HttpSession, it fails with the following message...
"Caused by: groovy.lang.MissingMethodException: No such method: buildContainer for class: nanocontainer with arguments: [org.picocontainer.defaults.DefaultPicoContainer-Le89R2mpRr8@public.gmane.org, org.apache.coyote.tomcat5.CoyoteRequestFacade@952905]"
I know it is working the for the first container (in the ServletContext compositionScope) because I print out the compositionScope as soon as the "buildContainer" method is entered and it says...
"compositionScope is: org.apache.catalina.core.ApplicationContextFacade-m6hyCi5e6VU@public.gmane.org"
Here is the script...
class DemoBuilder {
buildContainer(parent, compositionScope) {
System.out.println("compositionScope is: " + compositionScope);
pico = new org.picocontainer.defaults.DefaultPicoContainer(parent)
if (compositionScope instanceof javax.servlet.ServletRequest) {
System.out.println("I got here to register a component in the servlet request scope!!!!")
pico.registerComponentImplementation("util", SomeRequestUtil.class)
}
else if (compositionScope instanceof javax.servlet.http.HttpSession) {
System.out.println("I got here to register a component in the servlet session scope!!!!")
pico.registerComponentImplementation("counter", SomeCounter.class)
}
else if (compositionScope instanceof javax.servlet.ServletContext) {
//nothing to do for now
}
else {
//nothing to do for now
}
return pico
}
}
Here's the full stack trace....
org.nanocontainer.integrationkit.PicoCompositionException
at org.nanocontainer.script.groovy.GroovyContainerBuilder.createContainer(GroovyContainerBuilder.java:57)
at org.nanocontainer.integrationkit.LifecycleContainerBuilder.buildContainer(LifecycleContainerBuilder.java:25)
at org.nanocontainer.servlet.ServletRequestContainerLauncher.startContainer(ServletRequestContainerLauncher.java:48)
at org.nanocontainer.servlet.ServletRequestContainerFilter.doFilter(ServletRequestContainerFilter.java:36)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:233)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:204)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:257)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:151)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:564)
at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:245)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:199)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:151)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:564)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:195)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:151)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:164)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:149)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:564)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:156)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:151)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:564)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:972)
at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:206)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:828)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:700)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:584)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
at java.lang.Thread.run(Thread.java:534)
Caused by: groovy.lang.MissingMethodException: No such method: buildContainer for class: nanocontainer with arguments: [org.picocontainer.defaults.DefaultPicoContainer-Le89R2mpRr8@public.gmane.org, org.apache.coyote.tomcat5.CoyoteRequestFacade@952905]
at groovy.lang.MetaClass.invokeStaticMethod(MetaClass.java:291)
at groovy.lang.MetaClass.invokeMethod(MetaClass.java:247)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at groovy.lang.MetaClass.doMethodInvoke(MetaClass.java:765)
at groovy.lang.MetaClass.invokeMethod(MetaClass.java:214)
at org.codehaus.groovy.runtime.Invoker.invokeMethod(Invoker.java:130)
at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:98)
at nanocontainer.invokeMethod(nanocontainer.groovy)
at org.nanocontainer.script.groovy.GroovyContainerBuilder.createContainer(GroovyContainerBuilder.java:55)
... 27 more
Jake
---------------------------------------------------------------------
JIRA INFORMATION:
This message is automatically generated by JIRA.
If you think it was sent incorrectly contact one of the administrators:
http://jira.codehaus.org/secure/Administrators.jspa
If you want more information on JIRA, or have a bug to report see:
http://www.atlassian.com/software/jira