加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-14 16:25:25 所属栏目:大数据 来源:网络整理
导读:我有类似下面定义的过滤器.它们在不同的地方运行相同的代码块,所以为了保持DRY,我将该代码重构为一个名为doResponse()的方法. class MyFilters { def filters = { web(uri: '/web/**') { before = { // Do Stuff if (condition) { doResponse(request,respon
我有类似下面定义的过滤器.它们在不同的地方运行相同的代码块,所以为了保持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,params)
                }
                else {
                    // Do Stuff
                    doResponse(request,params)
                }

            }
            afterView = {
            }
        }
    }

    boolean doResponse(request,params) {
    // Do Stuff
        render(status: statusCode,contentType: "text/xml",encoding: "ISO-8859-1",text: text)
    // Do post-render stuff
        return false
    }
}

然而,这有一个令人讨厌的副作用.似乎render()方法只能从过滤器闭包中获得.我是否有任何(简洁的)方式从doResponse()调用render()?

编辑:我得到的错误是:

groovy.lang.MissingMethodException:没有方法签名:MyFilters.render()适用于参数类型:(java.util.LinkedHashMap)值:[[status:500,contentType:text / xml,encoding:ISO-8859-1,文字:……]]

解决方法

将定义render(..)方法的对象传递给doRespond(..)方法,并在该对象上调用render(..)方法.

闭包有一些implicit variables,包括它们的所有者指的是父关闭;所以我们可以通过:

if (condition) {
    doResponse(owner,request,params)
}

doRespond(..)方法:

boolean doResponse(webFilter,params) {
    // Do Stuff
    webFilter.render(status: statusCode,contentType: 
        "text/xml",text: text)
    // Do post-render stuff
    return false
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读