Grails扩展HttpServletResponse元类

Grails扩展HttpServletResponse元类,grails,groovy,metaclass,Grails,Groovy,Metaclass,我需要在不创建子类的情况下向response.setHeader()方法添加一些功能。我对它使用元类,如下所示: //grails bootstrap def overrideHttpResponse(){ def old_impl = javax.servlet.http.HttpServletResponseWrapper.metaClass.&setHeader println "Get set HEaders" println net.bull.ja

我需要在不创建子类的情况下向response.setHeader()方法添加一些功能。我对它使用元类,如下所示:

//grails bootstrap
  def overrideHttpResponse(){

    def old_impl = javax.servlet.http.HttpServletResponseWrapper.metaClass.&setHeader
    println "Get set HEaders"
    println net.bull.javamelody.CounterServletResponseWrapper.metaClass.methods.findAll { it.name == "setHeader" }.join("\n")
    println old_impl
    //output
    //Get set HEaders
    //public void javax.servlet.http.HttpServletResponseWrapper.setHeader(java.lang.String,java.lang.String)
    // org.codehaus.groovy.runtime.MethodClosure@6f62b062

    javax.servlet.http.HttpServletResponseWrapper.metaClass.setHeader = {String name, String value ->
      if(name == "Content-disposition"){
        value = value.replace(", "," ").replace(","," ")
      }
      println "In here"
      old_impl.invoke(name,value)
    }
  }
  //controller code
      withFormat {
      html result
      json {
        def map = exportService.getPackageMap(packageInstance, result.titlesList)

        def json = map as JSON

          response.setHeader("Content-disposition", "attachment; filename=\"${filename}.json\"")
          response.contentType = "application/json"
          println response.class
          //class net.bull.javamelody.CounterServletResponseWrapper
          render json
      }
println "Get set HEaders"
println response.class.metaClass.methods.findAll { it.name == "setHeader" }.join("\n")
def old_impl = javax.servlet.http.HttpServletResponseWrapper.metaClass.getMetaMethod("setHeader",[String,String] as Class[])
println old_impl
//Get set HEaders
//public void javax.servlet.http.HttpServletResponseWrapper.setHeader(java.lang.String,java.lang.String)
//public abstract void javax.servlet.http.HttpServletResponse.setHeader(java.lang.String,java.lang.String)
有什么建议可以解释为什么上述方法不起作用吗?我已经添加了打印输出作为注释,但是没有从元类中获取打印,内容配置值没有更改。我也试过这样:

//grails bootstrap
  def overrideHttpResponse(){

    def old_impl = javax.servlet.http.HttpServletResponseWrapper.metaClass.&setHeader
    println "Get set HEaders"
    println net.bull.javamelody.CounterServletResponseWrapper.metaClass.methods.findAll { it.name == "setHeader" }.join("\n")
    println old_impl
    //output
    //Get set HEaders
    //public void javax.servlet.http.HttpServletResponseWrapper.setHeader(java.lang.String,java.lang.String)
    // org.codehaus.groovy.runtime.MethodClosure@6f62b062

    javax.servlet.http.HttpServletResponseWrapper.metaClass.setHeader = {String name, String value ->
      if(name == "Content-disposition"){
        value = value.replace(", "," ").replace(","," ")
      }
      println "In here"
      old_impl.invoke(name,value)
    }
  }
  //controller code
      withFormat {
      html result
      json {
        def map = exportService.getPackageMap(packageInstance, result.titlesList)

        def json = map as JSON

          response.setHeader("Content-disposition", "attachment; filename=\"${filename}.json\"")
          response.contentType = "application/json"
          println response.class
          //class net.bull.javamelody.CounterServletResponseWrapper
          render json
      }
println "Get set HEaders"
println response.class.metaClass.methods.findAll { it.name == "setHeader" }.join("\n")
def old_impl = javax.servlet.http.HttpServletResponseWrapper.metaClass.getMetaMethod("setHeader",[String,String] as Class[])
println old_impl
//Get set HEaders
//public void javax.servlet.http.HttpServletResponseWrapper.setHeader(java.lang.String,java.lang.String)
//public abstract void javax.servlet.http.HttpServletResponse.setHeader(java.lang.String,java.lang.String)
此外,在我的控制器中,我再次尝试了此操作,返回的文件名没有任何更改:

   def old_impl = response.class.metaClass.getMetaMethod("setHeader",[String,String] as Class[])
   println old_impl
   //public abstract void javax.servlet.http.HttpServletResponse.setHeader(java.lang.String,java.lang.String)

    response.class.metaClass.setHeader = {String name, String value ->
      if(name == "Content-disposition"){
        value = value.replace(", "," ").replace(","," ")
      }
      println "In here"
      old_impl.invoke(name,value)
    }