WAR Grails в tomcat6, ошибка горячего повторного развертывания: вызовите «refresh» перед доступом к bean-компонентам через ApplicationContext - PullRequest
1 голос
/ 10 ноября 2010

У меня есть WAR Grails, который работает в рабочей среде в 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

Что я не ошибаюсь?Как я могу назвать это так называемым «обновить»?

Каков наилучший способ горячего повторного развертывания WAR на tomcat?

1 Ответ

2 голосов
/ 10 ноября 2010

Вероятно, мы не сможем решить эту проблему в Stackoverflow. Я надеюсь, что вы оцените мою попытку поддержки, если не сможете найти более качественную информацию.

Во-первых, документация Grails предлагает перезапустить Tomcat после (повторного) развертывания. Но это не должно быть необходимым в большинстве случаев.

Когда Tomcat перезагружает веб-приложение, Grails ServletContextListener получает информацию об этом событии и создает (должен создать) Grails / Spring ApplicationContext, который связывает все компоненты Spring приложения (используя вышеупомянутый метод refresh(..), BTW). Это идет не так в вашем случае.

Обычно, после горячего развертывания, вам просто нужно подождать некоторое время, пока ApplicationContext не станет полностью доступным, но это должно произойти, наконец, через некоторое время. Между этими двумя состояниями ваша ошибка будет нормальной. Spring работает над проблемой (уже довольно давно), чтобы заставить DispatcherServlet Spring ожидать второго состояния, даже когда запросы поступают до этого. Так что это считается улучшением , а не ошибкой.

Что касается процесса развертывания для самого Tomcat, см. Документацию Tomcat . По умолчанию горячее развертывание должно быть таким же простым, как перезапись существующего файла WAR и позволить Tomcat распаковать его, но это можно настроить в теге <Host> в conf / server.xml .

Другие идеи:

  • Я полагаю, что после повторного развертывания вы достаточно долго ждали, чтобы ошибка не возникала в течение ограниченного времени.
  • Вы можете опубликовать полную трассировку стека.
  • В файле web.xml вашей WAR есть ли <listener> s или <filter> s, которые не принадлежат пространству имен org.codehaus...?
  • Используете ли вы какие-либо специальные плагины, версии, спецификации?
  • Если вы настроили виртуальный хост в Tomcat, взгляните на настройки autoDeploy и unpackWAR.
...