tomcat 6中的Grails生成WAR,热重新部署错误:在通过ApplicationContext访问bean之前调用'refresh'

时间:2010-11-10 13:19:01

标签: deployment grails refresh tomcat6 war

我有一个grails WAR可以在tomcat6中生产,但是当我去重新部署WAR时,我会覆盖WAR文件。应用程序重新加载,我可以加载首页(静态页面),但是当我尝试转到任何其他页面时,我收到此警告。

org.codehaus.groovy.grails.web.taglib.exceptions.GrailsTagException: Error executing tag <g:render>: Error creating bean with name 'org.codehaus.groovy.grails.plugins.web.taglib.ApplicationTagLib': Instantiation of bean failed; nested exception is java.lang.IllegalStateException: BeanFactory not initialized or already closed - call 'refresh' before accessing beans via the ApplicationContext at /WEB-INF/grails-app/views/layouts/baseContainer.gsp:28

        at gsp_app_layoutsbaseContainerMapFb_gsp$_run_closure2.doCall(gsp_app_layoutsbaseContainer_gsp.groovy:42)

        at gsp_app_layoutsbaseContainerMapFb_gsp$_run_closure2.doCall(gsp_app_layoutsbaseContainer_gsp.groovy)

        at gsp_app_layoutsbaseContainerMapFb_gsp.run(gsp_app_layoutsbaseContainerMa_gsp.groovy:49)

        at java.lang.Thread.run(Unknown Source)

    Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.codehaus.groovy.grails.plugins.web.taglib.ApplicationTagLib': Instantiation of bean failed; nested exception is java.lang.IllegalStateException: BeanFactory not initialized or already closed - call 'refresh' before accessing beans via the ApplicationContext

        at gsp_app_templates_facebookConnect_gsp.run(gsp_app_templates_facebookConnect_gsp.groovy:23)

        ... 4 more

    Caused by: java.lang.IllegalStateException: BeanFactory not initialized or already closed - call 'refresh' before accessing beans via the ApplicationContext

我没有错?我怎么称之为所谓的“刷新”?

什么是在tomcat上热重新部署WAR的最好方法?

1 个答案:

答案 0 :(得分:2)

我们可能无法在Stackoverflow解决此问题。但是,如果您找不到更好的信息,我希望您能对我的支持尝试进行评分。

首先,Grails文档在(重新)部署之后向restart Tomcat建议。但在大多数情况下,这不应该是必要的。

当Tomcat重新加载Web应用程序时,Grails ServletContextListener会收到有关该事件的通知,并创建(应该创建)连接所有应用程序的Spring bean的Grails / Spring ApplicationContext(使用前面提到的{ {1}}方法,BTW)。这样你的情况就出错了。

通常,在热部署之后,您只需要等待一段时间,直到refresh(..)完全可用,但最后应该是一段时间之后。在这两种状态之间,您的错误将是正常的。 Spring is working on the problem(现在已经有一段时间了)让Spring ApplicationContext等待第二个状态,即使请求在此之前进入。所以这被认为是改进,而不是错误。

关于Tomcat本身的部署过程,请参阅Tomcat documentation。默认情况下,热部署应该像覆盖现有WAR文件并让Tomcat解压缩一样简单,但可以在 conf / server.xml 中的DispatcherServlet标记上进行自定义。 / p>

其他想法:

  • 我猜你在重新部署后确实等了足够长的时间,以确保错误不会在有限的时间内发生。
  • 您可以发布完整的堆栈跟踪。
  • 在WAR的 web.xml 文件中,是否有<Host>个或<listener>不属于命名空间<filter>
  • 您使用任何特殊的插件,版本,规格吗?
  • 如果您在Tomcat中设置了虚拟主机,请查看org.codehaus...autoDeploy设置。