从Grails中的过滤器帮助器方法调用render()

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 ,文字:......]]

rob*_*ert 8

将定义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)