Grails App在重新部署后缺少链接中的应用程序上下文

时间:2016-08-17 14:09:36

标签: grails gsp applicationcontext

我的Grails 2.3.7应用程序缺少特定场景中链接的应用程序上下文。在我开发的同时,一切都很好。当我将应用程序部署到Tomcat 8并在dbCreatecreate的数据源中以create-drop启动它时,一切正常。但是当我重新启动Tomcat(或重新部署)并将数据源中的dbCreate设置为none时,应用程序中的链接将在没有应用程序上下文的情况下生成。 我在开发中使用<g:link controller="controller" action="action">Link Text</g:link>创建链接,如果使用dbCreate="create"链接生成为/application/controller/action,但在重新启动后使用dbCreate="none"链接生成为/controller/actionapplication部分缺失,因此无法找到链接的目标。对于像css文件这样的资源,可以正确生成资源链接,包括application部分。 我尝试在Config.groovy中设置grails.app.contextgrails.serverURL,但没有成功。我对解决这个问题的任何暗示表示感谢。 (搜索SO只会返回相反方向的问题,人们会问如何省略链接中的应用程序部分,这不是我想要的。)

更新:似乎与tomcat无关,与grails run-app一起运行时,我的行为相同。

更新:我可以使用run-appprod run-app以及已部署的战争重现此问题,但错误并非每次都发生,也许在网络应用的3次启动中有2次发生,所以我想这可能是servlet上下文的时间问题,但我还不知道。

Upadte:调试显示,在DefaultLinkGenerator中,contextPath等于空字符串,但应为null或&#39; application&#39;。

更新:在应用启动期间正确实例化grails bean grailsLinkCreator。这个bean在CachingLinkGenerator中实现,调用它的超类DefaultLinkGenerator。在启动期间的某个时间,但在创建和初始化此bean之后,contextPath中的变量DefaultLinkGenerator被设置为空字符串,但我不知道何时,何时以及为何。< / p>

1 个答案:

答案 0 :(得分:-1)

我仍然无法修复(或找到)发生这种情况的原因,但我在SO上找到了一个解决方法:Grails - override a bean property value in resources.groovy

相关部分是:

  

如果要在BootStrap运行之前修改bean,可以使用a   BeanPostProcessor [...]

     

的src /常规/ yourpkg / CustomBeanPostProcessor:

import org.springframework.beans.factory.config.BeanPostProcessor

class CustomBeanPostProcessor implements BeanPostProcessor{

    @Override
    Object postProcessBeforeInitialization(Object bean, String beanName) {
        return bean
    }

    @Override
    Object postProcessAfterInitialization(Object bean, String beanName) {
        if(beanName == 'messageSource') {
            bean.setFallbackToSystemLocale = true
        }
        return bean
    }
}
     

resources.groovy:

beans = {
    customBeanPostProcessor(CustomBeanPostProcessor)
}