我正在使用grails 2.0.1并覆盖渲染方法。
我有以下代码。
grailsApplication.controllerClasses.each { controller ->
//keep old render method
def original = controller.metaClass.getMetaMethod("render", [Map] as Class[])
controller.metaClass.originalRender = original.getClosure()
controller.metaClass.renderForBrand = { Map args ->
originalRender(args)
}
}
在original.getClosure()中,我得到了以下错误。
Message: groovy.lang.MissingMethodException: No signature of method: org.codehaus.groovy.reflection.CachedMethod.getClosure() is applicable for argument types: () values: []
Possible solutions: getClass()
Line | Method
->> 300 | evaluateEnvironmentSpecificBlock in grails.util.Environment
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 293 | executeForEnvironment in ''
| 269 | executeForCurrentEnvironment . . in ''
| 303 | innerRun in java.util.concurrent.FutureTask$Sync
| 138 | run . . . . . . . . . . . . . . in java.util.concurrent.FutureTask
| 886 | runTask in java.util.concurrent.ThreadPoolExecutor$Worker
| 908 | run . . . . . . . . . . . . . . in ''
^ 662 | run in java.lang.Thread
在grails 1.3.7中我的代码工作正常,如果是grails 2.x则失败。 任何帮助都非常有用。 感谢。
答案 0 :(得分:1)
您可以保存对原始render
方法的引用,并调用invoke
方法以执行它:
grailsApplication.controllerClasses.each { controller ->
//keep old render method
def originalRenderMethod = controller.metaClass.getMetaMethod("render", [Map] as Class[])
controller.metaClass.renderForBrand = { Map args ->
originalRenderMethod.invoke(delegate, args)
}
}
无论使用Grails 1.3.x还是2.0.x(我都测试过),这种机制都有效。