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

时间:2016-02-22 16:21:54

标签: grails interceptor grails-controller

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

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是一个由所有其他控制器扩展的抽象类

1 个答案:

答案 0 :(得分:1)

我缺少的是将myVar声明为static,就像那样简单!

<强>更新
如果由于任何原因您无法将变量定义为static,则可以将其设置为拦截器中request对象的属性,并从控制器中的那里读取

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

// Controller
request.getAttribute('myVar')