Grails 如果从脚手架模板调用,则未找到控制器方法

Grails 如果从脚手架模板调用,则未找到控制器方法,grails,groovy,Grails,Groovy,我最近启动了一个新的Grails项目,我正在尽可能多地使用scaffold特性。我使用grails安装模板安装了这些模板,并对它们进行了修改,使它们在某些方法可用时依赖于当前控制器(例如,如果可用,show方法将调用renderShow方法) 我的问题是,当从scaffold模板调用该方法时,找不到它,因此会引发异常。如果从实际控制器调用相同的方法,则它将按预期工作 我错过了什么 为了说明这个问题,我创建了一个小项目。有趣的提交是: 运行应用程序时,如果转到testDemoMethod(…/G

我最近启动了一个新的Grails项目,我正在尽可能多地使用scaffold特性。我使用grails安装模板安装了这些模板,并对它们进行了修改,使它们在某些方法可用时依赖于当前控制器(例如,如果可用,show方法将调用renderShow方法)

我的问题是,当从scaffold模板调用该方法时,找不到它,因此会引发异常。如果从实际控制器调用相同的方法,则它将按预期工作

我错过了什么

为了说明这个问题,我创建了一个小项目。有趣的提交是:

运行应用程序时,如果转到testDemoMethod(…/GrailsScaffoldingMethodCallProblem/demo/testDemoMethod),则会呈现“Hi,我是一个方法”,并打印以下内容:

[public java.lang.Object grailsscaffoldingmethodcallproblem.DemoController.this$2$demoMethod()]
但是如果您转到索引(…/GrailsScaffoldingMethodCallProblem/demo/testDemoMethod),将打印一个空列表,我将获得一个异常:

Message: No signature of method: grailsscaffoldingmethodcallproblem.DemoController.demoMethod() is applicable for argument types: () values: []
   Line | Method
->>  11 | index    in grailsscaffoldingmethodcallproblem.DemoController
有没有线索说明为什么会发生这种情况,或者如何避免这种情况

编辑
Ian Robert的回答解决了这个问题:

因为脚手架模板中的
这个
没有引用声明
静态脚手架=true的控制器类。当您在控制器类a中使用运行时动态脚手架时,脚手架模板用于生成一个单独的类(称为B,尽管实际上它可能与a同名,但可以通过不同的类加载器加载)A的每个实例都会将B定义但A没有显式重写的任何操作委托给B的实例

如果您需要从框架代码内部获取真实的控制器实例,那么您可能需要使用以下技巧

import grails.util.GrailsWebUtil
...
def index() { 
    def realController = GrailsWebUtil.getControllerFromRequest(request)
    println realController.respondsTo('demoMethod')  
    realController.demoMethod() 
    redirect(action: "list", params: params) 
}

这就是诀窍,非常感谢!我认为搭建的东西可以在另一个类中,但是类名是相同的,我没有考虑类加载器的可能性。非常聪明:-)!我会投票支持你,但我似乎没有足够的声誉:-(.再次感谢。@Deigote您可以通过单击左侧的勾号来接受答案,这本身将给您+2个代表。您不需要很长时间就可以获得前几个特权。因为这个问题是由几个人投票决定的,所以我有足够的声望投票支持您-然后stackoverflow本身就警告我“接受答案”事情。所以我已经做了两件事。再次感谢:)!