【问题标题】:Controller method not found if called from scaffolding template如果从脚手架模板调用,则找不到控制器方法
【发布时间】:2013-04-26 07:33:42
【问题描述】:

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

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

我错过了什么?

为了说明这个问题,我创建了一个小项目。有趣的提交是这个: 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

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

编辑: 伊恩罗伯特的回答解决了这个问题:Controller method not found if called from scaffolding template

【问题讨论】:

    标签: grails groovy


    【解决方案1】:

    因为脚手架模板中的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) 
    }
    

    【讨论】:

    • 这就是诀窍,非常感谢!我以为脚手架的东西可能在另一个类中,但是类名相同,我没有考虑类加载器的可能性。非常聪明 :-)!我会投票给你,但似乎我没有足够的声誉:-(。再次感谢。
    • @Deigote 您可以通过单击左侧的勾号接受答案,这本身将为您提供 +2 代表。获得前几个特权应该不会花很长时间。
    • 因为这个问题是由少数人投票赞成的,所以我有足够的声誉来投票给你——然后 stackoverflow 本身就警告我“接受答案”的事情。所以我已经做了这两件事。再次感谢:)!
    猜你喜欢
    • 2012-10-01
    • 2012-04-09
    • 2020-05-16
    • 2016-05-22
    • 2011-02-13
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    • 2012-03-27
    相关资源
    最近更新 更多