deployment - 在tomcat 6中导致Grails生产WAR,热重新部署错误:在通过ApplicationContext访问bean之前,请调用 'refresh'

标签 deployment grails refresh tomcat6 war

我有一个可以在tomcat6中生产的grails WAR,但是当我重新部署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的最佳方法是什么?

最佳答案

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

首先,Grails文档建议在(重新)部署后使用restart Tomcat。但这在大多数情况下不是必需的。

当Tomcat重新加载Web应用程序时,Grails ServletContextListener会得到关于该事件的通知,并创建(应该创建)Grails / Spring ApplicationContext,以连接所有应用程序的Spring Bean(通过使用上述refresh(..)方法BTW)。在您的情况下,这是错误的。

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

至于到Tomcat本身的部署过程,请参阅Tomcat documentation。默认情况下,热部署应该和覆盖现有的WAR文件并让Tomcat解压缩一样容易,但是可以在conf / server.xml中的<Host>标记上对其进行自定义。

其他想法:

  • 我猜您在重新部署后确实等待了足够长的时间,以确保仅在有限的时间内不会发生错误。
  • 您可以发布完整的堆栈跟踪。
  • 在WAR的web.xml文件中,是否存在不属于命名空间<listener>的任何<filter>org.codehaus...
  • 您是否使用任何特殊的插件,版本,规范?
  • 如果您已在Tomcat中设置了虚拟主机,请看一下autoDeployunpackWAR设置。
  • 关于deployment - 在tomcat 6中导致Grails生产WAR,热重新部署错误:在通过ApplicationContext访问bean之前,请调用 'refresh',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4144856/

    相关文章:

    javascript - Heroku Node 部署 "internal server error"

    .net - 使用本地服务器上的 powershell 脚本应用服务包(.msu 文件)更新

    asp.net - 发布 ASP.Net Web 应用程序时,如何排除目标文件夹的删除?

    grails - Grails GORM 查询中 join 的使用

    grails - Grails-为什么setDateCreated被多次调用?

    excel - 自动刷新自动过滤器 - VBA 与否

    javascript - 从当前页面刷新不同的页面

    google-app-engine - 如何最好地将单个 Google App Engine 应用程序部署到多个特定于区域的子域?

    c# - 多 View 刷新页面并丢失 ASP.NET Webform 中的数据

    json - 无法将JSONObject从Grails Controller 传递到Grails服务