Grails 3 - 在拦截器中分配控制器的变量
Grails 3 - assign controller's variable in interceptor
我正在通过 Grails 2.5.1 web-app 升级到 grails 3,但我遇到了这个问题:在我的控制器中,我使用 beforeInterceptor
s 来预先计算一组变量用于他们的操作方法。
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')
我正在通过 Grails 2.5.1 web-app 升级到 grails 3,但我遇到了这个问题:在我的控制器中,我使用 beforeInterceptor
s 来预先计算一组变量用于他们的操作方法。
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')