我有一个从带有beforeInterceptor
的类继承的 Controller 。
这是我的基础课。
class FooBase {
def beforeInterceptor = [action: {parentInterceptor()}]
def parentInterceptor() {
render("Snarge")
}
}
这是不起作用的 Controller 的版本。
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
功能一起使用。这要求在使用映射实现拦截器时能够对其进行链接。 最佳答案
两者之间有区别
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方法。