Grails扩展HttpServletResponse元类
我需要在不创建子类的情况下向response.setHeader()方法添加一些功能。我对它使用元类,如下所示: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
//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)
}