run-app和run-war之间的Grails行为差异

时间:2009-07-07 04:05:59

标签: grails groovy bootstrapping metaclass expandometaclass

我对Groovy和Grails比较新,我在业余时间尝试使用它们。我有一个小测试Grails应用程序,我可以使用grails run-app正常运行,但grails run-war会导致错误。

grails-app/conf/BootStrip.init方法中,我将一些属性getter添加到DefaultGrailsControllerClassDefaultGrailsApplication

DefaultGrailsControllerClass.metaClass.getMenuText = { ->
    getPropertyOrStaticPropertyOrFieldValue('menuText', String.class)
}
DefaultGrailsControllerClass.metaClass.getMenuOrder = { ->
    getPropertyOrStaticPropertyOrFieldValue('menuOrder', Integer.class)
}
DefaultGrailsApplication.metaClass.getMenuControllerClasses = { ->
    controllerClasses.findAll { it.menuText != null }.sort { it.menuOrder }
}

在我的grails-app/views/layouts/main.gsp中,我正在使用它:

<g:each var="c" in="${ grailsApplication.menuControllerClasses }">
    <li><g:link controller="${c.logicalPropertyName}">${c.menuText}</g:link></li>
</g:each>

这在run-app下工作正常,但在run-war下运行,我得到以下内容:

groovy.lang.MissingPropertyException: No such property: menuControllerClasses for class: org.codehaus.groovy.grails.commons.DefaultGrailsApplication

我在Grails 1.1.1和1.2-M1下尝试了这个并得到了相同的结果。我已经确认正在调用BootStrap.init方法(通过println),但对metaClass所做的更改似乎不在run-war下。< / p>

知道我缺少什么吗?

1 个答案:

答案 0 :(得分:3)

grails run-war - 在Jetty中运行Grails应用程序的WAR

grails run-app - 在Jetty中运行Grails应用程序

差异似乎是run-war不支持像run-app那样重新加载。

不确定你遗失了什么。