Ein*_*nar 5 grails groovy dry filter
我有类似下面定义的过滤器.它们在不同的地方运行相同的代码块,所以为了保持DRY,我将该代码重构为一个名为doResponse()的方法.
class MyFilters {
def filters = {
web(uri: '/web/**') {
before = {
// Do Stuff
if (condition) {
doResponse(request, response, params)
}
return true
}
after = {
if (condition) {
doResponse(request, response, params)
}
else {
// Do Stuff
doResponse(request, response, params)
}
}
afterView = {
}
}
}
boolean doResponse(request, response, params) {
// Do Stuff
render(status: statusCode, contentType: "text/xml", encoding: "ISO-8859-1", text: text)
// Do post-render stuff
return false
}
}
Run Code Online (Sandbox Code Playgroud)
然而,这有一个令人讨厌的副作用.似乎render()方法只能从过滤器闭包中获得.我是否有任何(简洁的)方式从doResponse()调用render()?
编辑:我得到的错误是:
groovy.lang.MissingMethodException:没有方法签名:MyFilters.render()适用于参数类型:(java.util.LinkedHashMap)值:[[status:500,contentType:text/xml,encoding:ISO-8859-1 ,文字:......]]
将定义render(..)方法的对象传递给doRespond(..)方法,并render(..)在该对象上调用该方法.
闭包有一些隐式变量,包括它们owner引用父闭包; 所以我们可以通过:
if (condition) {
doResponse(owner, request, response, params)
}
Run Code Online (Sandbox Code Playgroud)
doRespond(..) 方法:
boolean doResponse(webFilter, request, response, params) {
// Do Stuff
webFilter.render(status: statusCode, contentType:
"text/xml", encoding: "ISO-8859-1", text: text)
// Do post-render stuff
return false
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2854 次 |
| 最近记录: |