A technical question for the Spring experts:

In the current implementation of the blocks fw the BlockServlet is a Spring managed component, but it gets init and destroy methods are called in the DispatcherServlet. After having fought a little bit more about it (and experienced some subtle initialization order problem that I had to hack around), I have realized that it not is such a good idea to let the DispatcherServlet have any part in the initialization. This is both from a SoC perspective and from the fact that the DispatcherServlet doesn't know anything about the dependency graph of the BlockServlet components.

The conclusion is that all setup of the BlockServlet should be performed by the Spring container. The natural way to do this seemed for me to let the BlockServlet implement the Spring interfaces: ServletConfigAware (so that it get the servlet config that the Spring web context uses) and InitializingBean and DisposableBean, for actually calling the Servlet init and destroy methods.

While trying that, the container is unhappy with the ServletConfigAware and says that it doesn't have any servlet config. Before trying to dig into exactly what happens, I would like to hear from the Spring experts (Carsten e.g.) if you have any idea about what I'm missing. Here is the stack trace:

Embedded error: Cannot invoke listener [EMAIL PROTECTED] Cannot satisfy ServletConfigAware for bean 'org.apache.cocoon.ajax.block' without ServletConfig [INFO] ------------------------------------------------------------------------
[INFO] Trace
org.apache.maven.lifecycle.LifecycleExecutionException: Failure
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:559) at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeStandaloneGoal(DefaultLifecycleExecutor.java:488) at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:458) at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(DefaultLifecycleExecutor.java:306) at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:273) at org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:140)
        at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:322)
        at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:115)
        at org.apache.maven.cli.MavenCli.main(MavenCli.java:256)
        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:585)
at org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315)
        at org.codehaus.classworlds.Launcher.launch(Launcher.java:255)
at org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:430)

        at org.codehaus.classworlds.Launcher.main(Launcher.java:375)
Caused by: org.apache.maven.plugin.MojoExecutionException: Failure
at org.mortbay.jetty.plugin.AbstractJettyMojo.startJetty(AbstractJettyMojo.java:296) at org.mortbay.jetty.plugin.AbstractJettyMojo.execute(AbstractJettyMojo.java:242) at org.mortbay.jetty.plugin.AbstractJettyRunMojo.execute(AbstractJettyRunMojo.java:122) at org.mortbay.jetty.plugin.Jetty6RunMojo.execute(Jetty6RunMojo.java:160) at org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:412) at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:534)
        ... 16 more
Caused by: java.lang.RuntimeException: Cannot invoke listener [EMAIL PROTECTED] at org.apache.cocoon.bootstrap.servlet.ShieldingListener.invoke(ShieldingListener.java:181) at org.apache.cocoon.bootstrap.servlet.ShieldingListener.contextInitialized(ShieldingListener.java:204) at org.mortbay.jetty.handler.ContextHandler.startContext(ContextHandler.java:368) at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:957) at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:341) at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:367) at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:37) at org.mortbay.jetty.handler.HandlerCollection.doStart(HandlerCollection.java:101)
        at org.mortbay.jetty.Server.doStart(Server.java:235)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:37) at org.mortbay.jetty.plugin.Jetty6PluginServer.start(Jetty6PluginServer.java:114) at org.mortbay.jetty.plugin.AbstractJettyMojo.startJetty(AbstractJettyMojo.java:285)
        ... 21 more
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.apache.cocoon.ajax.block' defined in URL [file:C:/cygwin/usr/local/svn/cocoon-trunk/core/cocoon-webapp/target/cocoon-webapp/WEB-INF/cocoo n/spring/cocoon-ajax-sample-blockServlet.xml]: Initialization of bean failed; nested exception is java.lang.IllegalStateException: Cannot satisfy ServletConfigAware for bean 'org.apache.cocoon.ajax.block' without ServletConfig at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:442) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:245) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:141) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:242) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:156) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:290) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:348) at org.springframework.web.context.support.AbstractRefreshableWebApplicationContext.refresh(AbstractRefreshableWebApplicationContext.java:156) at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:246) at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:184) at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:49) at org.apache.cocoon.bootstrap.servlet.ShieldingListener.invoke(ShieldingListener.java:152)
        ... 32 more
Caused by: java.lang.IllegalStateException: Cannot satisfy ServletConfigAware for bean 'org.apache.cocoon.ajax.block' without ServletConfig at org.springframework.web.context.support.ServletContextAwareProcessor.postProcessBeforeInitialization(ServletContextAwareProcessor.java:90) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanF
actory.java:297)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1025) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:420)
        ... 43 more

Reply via email to