我正在通过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是一个由所有其他控制器扩展的抽象类
答案 0 :(得分:1)
我缺少的是将myVar
声明为static
,就像那样简单!
<强>更新强>
如果由于任何原因您无法将变量定义为static
,则可以将其设置为拦截器中request
对象的属性,并从控制器中的那里读取
// Interceptor
request.setAttribute('myVar', calculateMyVarFromParams(params))
// Controller
request.getAttribute('myVar')