grails中的通用方法拦截(特别是控制器)

时间:2012-06-08 22:42:49

标签: grails groovy

我正在尝试在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中有可用的控制器拦截器和过滤器,但它们并没有真正集中我想要实现的目标,而是试图为某些集中行为创建一个简单的通用函数

任何关于为什么这对控制器不起作用的指导将不胜感激,谢谢

2 个答案:

答案 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的内容?