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

2024-01-24

我最近开始了一个新的 Grails 项目,我正在尝试尽可能多地使用脚手架功能。我使用 grails install-templates 安装了模板并对其进行了修改,以便在某些方法可用时它们依赖于当前控制器(例如,show 方法将调用 renderShow 方法(如果可用))。

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

我缺少什么?

为了说明这个问题,我创建了一个小项目。有趣的提交是这个:https://github.com/deigote/GrailsS​​caffoldingMethodCallProblem/commit/0fce966bad6e8004a7133511149c09de54be24bf https://github.com/deigote/GrailsScaffoldingMethodCallProblem/commit/0fce966bad6e8004a7133511149c09de54be24bf

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

[public java.lang.Object grailsscaffoldingmethodcallproblem.DemoController.this$2$demoMethod()]

但是,如果您转到索引 (.../GrailsS​​caffoldingMethodCallProblem/demo/testDemoMethod),则会打印一个空列表,并且出现异常:

Message: No signature of method: grailsscaffoldingmethodcallproblem.DemoController.demoMethod() is applicable for argument types: () values: []
   Line | Method
->>  11 | index    in grailsscaffoldingmethodcallproblem.DemoController

任何线索为什么会发生这种情况或如何解决它?

Edit: 伊恩·罗伯特的回答解决了这个问题:如果从脚手架模板调用,则找不到控制器方法 https://stackoverflow.com/questions/16332787/controller-method-not-found-if-called-from-scaffolding-template#answer-16337509


Because this脚手架模板内不引用声明的控制器类static scaffold = true。当您在控制器类中使用运行时动态脚手架时A脚手架模板用于生成一个单独的类(称之为B,尽管事实上它可能与A但通过不同的类加载器加载)和每个实例A将委托给一个实例B任何行动B定义但是A没有明确覆盖。

如果您需要从脚手架代码内部获取真正的控制器实例,您可能需要使用类似的技巧

import grails.util.GrailsWebUtil
...
def index() { 
    def realController = GrailsWebUtil.getControllerFromRequest(request)
    println realController.respondsTo('demoMethod')  
    realController.demoMethod() 
    redirect(action: "list", params: params) 
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果从脚手架模板调用,则找不到控制器方法 的相关文章

随机推荐