Я относительно новичок в Groovy и Grails, и я пробовал их в свободное время. У меня есть небольшое тестовое приложение Grails, которое я могу выполнить нормально, используя grails run-app
, но grails run-war
приводит к ошибке.Разница в поведении Grails между run-app и run-war
В методе grails-app/conf/BootStrip.init
я добавляю некоторые методы получения собственности на DefaultGrailsControllerClass
и DefaultGrailsApplication
:
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
.
Любая идея, что мне не хватает?
Я где-то читал, что 'run-app' использует Tomcat, начиная с Grails 1.3. –