gpt4 book ai didi

grails - 使用groovy 1.8及更高版本重写渲染方法

转载 作者:行者123 更新时间:2023-12-02 14:45:23 24 4
gpt4 key购买 nike

我正在使用grails 2.0.1和重写render方法。

我有以下代码。

 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中,它失败了。
任何帮助都非常有用。
谢谢。

最佳答案

您可以保存对原始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(我都对它们进行了测试),该机制都有效。

关于grails - 使用groovy 1.8及更高版本重写渲染方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12743321/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com