1

grails2.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では、コードは正常に機能しています。grails2.xの場合、失敗します。どんな助けでも大いに感謝されます。ありがとう。

4

1 に答える 1

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の使用に関係なく機能します(両方をテストしました)。

于 2012-11-06T10:38:07.877 に答える