Прежде всего , Bootstrap.groovy не может быть лучшим местом для такого метапрограммирования. Проблема с этим подходом заключается в том, что изменения в классах будут применяться при запуске приложения, но вы можете потерять эти изменения, когда приложение будет перезагружено. Очевидно, что это только проблема во время разработки, а не проблема вообще, если вы не против перезапуска сервера каждый раз, когда вы вносите изменения, но я бы сказал, что это быстро станет серьезным раздражением. Чтобы изменения были применены при перезагрузке приложения, вы должны переместить метапрограммирование в плагин, где вы можете подключиться к событию жизненного цикла приложения .
Так шаги:
- Создать плагин
- Сделайте метапрограммирование в
doWithDynamicMethods
и onChange
закрытия плагина дескриптора
Вот полный пример, где я «переопределить» chain() на всех классах контроллера. Код, аналогичный для метода save() для классов домена, должен содержать только некоторые очевидные замены, например. использовать application.domainClasses
вместо application.controllerClasses
def doWithDynamicMethods = {ctx ->
application.controllerClasses.each {controller ->
replaceChain(controller)
}
}
def onChange = {event ->
if (application.isArtefactOfType(ControllerArtefactHandler.TYPE, event.source)) {
def clz = application.getControllerClass(event.source?.name)
replaceChain(clz)
}
}
private replaceChain(controllerClass) {
// Save a reference to the grails chain() method
def grailsChain = controllerClass.metaClass.pickMethod("chain", [Map] as Class[])
controllerClass.metaClass.chain = {Map params ->
println "My code to execute before chain goes here"
// Invoke the grails chain() method
grailsChain.invoke(delegate, [params] as Object[])
println "My code to execute after chain goes here"
}
}
Пробовал, что вчера. Не работает, говоря, что 'origSave' является свойством метакласса или чем-то, а не закрытием, что-то вроде этого. Пробовал разные способы его называть: 'origSave()' и 'origSave.call()' – Archer
Исправить код здесь: http://stackoverflow.com/a/8388366/207791 –