代码之家  ›  专栏  ›  技术社区  ›  Einar

从Grails中的filter helper方法调用render()

  •  5
  • Einar  · 技术社区  · 14 年前

    我有如下定义的过滤器。它们在不同的地方运行相同的代码块,因此为了保持干燥,我将该代码重构为一个名为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
        }
    }
    

    编辑:我得到的错误是:

    groovy.lang.MissingMethodException:方法MyFilters.render()的签名不适用于参数类型:(java.util.LinkedHashMap)值:[[状态:500,内容类型:文本/xml,编码:ISO-8859-1,文本:…]]

    3 回复  |  直到 14 年前
        1
  •  8
  •   robbbert    14 年前

    传递定义 render(..) 方法到 doRespond(..) 方法,并调用 渲染(…) 方法。

    闭包有一些 implicit variables owner 指父闭包;因此我们可以传递:

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

    多雷斯邦(…) 方法:

    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
    }
    
        2
  •  0
  •   tim_yates    14 年前

    render 作用于 doResponse 功能?

    即:

    if( condition ) {
      doResponse(request, response, params, this.&render )
    }
    

    boolean doResponse( request, response, params, renderFn ) {
    // Do Stuff
        renderFn( status: statusCode, contentType: "text/xml", encoding: "ISO-8859-1", text: text )
    // Do post-render stuff
        return false
    }
    
        3
  •  0
  •   Lari Hotari    14 年前

    你可以试试这个办法。

    将doResponse改为closure:

     def doResponse = {
            render(status: statusCode, contentType: "text/xml", encoding: "ISO-8859-1", text: text)
            return false 
     }
    

    调用doResponse(来自筛选器闭包):

    def doResponseClosure = doResponse.clone()
    doResponseClosure.delegate = delegate
    // if it doesn't work, try adding: doResponseClosure.owner = owner
    return doResponseClosure()
    

    由于并发原因,克隆已完成。