我正在尝试在grails中创建一个通用函数,允许我指定一个类和函数名,并根据该条件拦截任何函数调用:
getSomeClass().metaClass.invokeMethod = { String methodName, args ->
MetaMethod someAction = getSomeClass().metaClass.getMetaMethod(methodName, args)
def result = someAction.invoke(delegate, args)
if (methodName==getSomeMethodName())
intercept(args, result)
return result
}
这适用于POGO和域类,但似乎不适用于控制器类。虽然我完全清楚Grails中有可用的控制器拦截器和过滤器,但它们并没有真正集中我想要实现的目标,而是试图为某些集中行为创建一个简单的通用函数
任何关于为什么这对控制器不起作用的指导将不胜感激,谢谢
答案 0 :(得分:3)
您的方法适用于通过Groovy元类机制进行的方法调用,但在Grails 2中,这不适用于控制器操作 - 它们使用普通Java反射(java.lang.reflect.Method.invoke
)调用,因此您的自定义invokeMethod
已被绕过。
如果你想要一个适用于来自Java和Groovy的调用的AOP机制,你可能不得不使用像AspectJ加载时编织这样的东西。 Spring的基于代理的AOP可以工作但是Grails 2控制器系统依赖于具有特定@Action
注释的动作方法(在编译时通过AST转换添加)并且我不知道Spring AOP代理是否保留生成的代理方法上来自目标类的方法注释。
答案 1 :(得分:0)
定义后,grails框架会覆盖MyController.metaClass.invokeMethod
吗?
您是否尝试通过反思检查MyController.metaClass.invokeMethod
的内容?