你如何在交互之前链接?

时间:2011-01-11 02:22:12

标签: inheritance grails interceptor

我有一个控制器,它继承自一个beforeInterceptor的类。

这是我的基类。

class FooBase {
    def beforeInterceptor = [action: {parentInterceptor()}]

    def parentInterceptor() {
        render("Snarge")
    }
}

以下是无效的控制器版本。

class BrokenController extends FooBase
{
    def beforeInterceptor = [action: {childInterceptor()}]

    def childInterceptor() {
        super.beforeInterceptor.action.call()
        render("Bar")
    }

    def index = {
        render("Foo")
    }
}

以下是 工作

的版本
class WorkingController extends FooBase
{
    def beforeInterceptor = {
        super.beforeInterceptor.action.call()
        render("Bar")
    }

    def index = {
        render("Foo")
    }
}

当我在WorkingController上调用index时,我得到输出SnargeBarFoo。当我在BrokenController上调用索引时,我得到IllegalAccessError

我想我的版本有效,所以我的问题更多的是关于这里发生了什么?为什么一个版本可以从子类访问父类,但另一个版本不能访问?

我正在寻找的用例是能够使用具有except功能的拦截器功能。这需要能够在使用地图实现拦截器时链接拦截器。

1 个答案:

答案 0 :(得分:1)

之间存在差异
this.

this.&

以下代码有效 - 检查第三行:

class BrokenController extends FooBase
{
    def beforeInterceptor = [action: {this&childInterceptor()}]

    def childInterceptor() {
        super.beforeInterceptor.action.call()
        render("Bar")
    }

    def index = {
        render("Foo")
    }
}

文档说明了以下内容。&

Method Reference     .&      Get a reference to a method, can be useful for creating closures from methods 

所以我不确定,但我想它调用了该方法的作用域。或许系统会创建某种辅助类,以便执行一个闭包,导致这个类没有super。 beforeInterceptor方法。