Grails 3 - 在拦截器中分配控制器的变量

Grails 3 - assign controller's variable in interceptor

我正在通过 Grails 2.5.1 web-app 升级到 grails 3,但我遇到了这个问题:在我的控制器中,我使用 beforeInterceptors 来预先计算一组变量用于他们的操作方法。

class MyController {

    def myVar

    def beforeInterceptor = {
        myVar = calculateMyVarFromParams(params)
    }

    def index() {
        /* myVar is already initialized */
    }
}

现在 Grails 3 拦截器更强大并且在单独的文件上,我怎样才能达到相同的结果?为了避免使用请求范围变量,我尝试使用以下代码

class MyInterceptor {

    boolean before() {
        MyController.myVar = calculateMyVarFromParams(params)
        MyController.myVar != null  // also block execution if myVar is still null
    }

    boolean after() { true }

    void afterView() { /* nothing */ }
}

class MyController {

    def myVar

    def index() {
        println('myVar: '+myVar)
    }
}

但我明白了

ERROR org.grails.web.errors.GrailsExceptionResolver - MissingPropertyException occurred when processing request: [GET] /my/index
No such property: myVar for class: com.usablenet.utest.MyController
Possible solutions: myVar. Stacktrace follows:
groovy.lang.MissingPropertyException: No such property: myVar for class: com.usablenet.utest.MyController
Possible solutions: myVar
at com.usablenet.utest.MyInterceptor.before(MyInterceptor.groovy:15) ~[main/:na]

我假设(显然是错误的)这是可行的。有解决办法吗?提前致谢!

注意:在我的例子中,MyController 是一个抽象 class 由所有其他控制器扩展

我缺少的是将 myVar 声明为 static,就这么简单!

更新
如果出于任何原因您不能将变量定义为 static,您可以将其设置为拦截器中 request 对象的属性,并在控制器中从那里读取它

// Interceptor
request.setAttribute('myVar', calculateMyVarFromParams(params))

// Controller
request.getAttribute('myVar')