2

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

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

4

2 回答 2

3

您的方法适用于通过 Groovy 元类机制进行的方法调用,但在 Grails 2 中,这不适用于控制器操作 - 它们是使用普通 Java 反射 ( java.lang.reflect.Method.invoke) 调用的,因此您的自定义invokeMethod被绕过。

如果您想要一种适用于来自 Java 和 Groovy 的调用的 AOP 机制,您可能必须使用 AspectJ 加载时编织之类的东西。Spring 的基于代理的 AOP 可能工作,但 Grails 2 控制器系统依赖于具有特定@Action注释的操作方法(在编译时由 AST 转换添加),我不知道 Spring AOP 代理是否保留来自目标的方法注释生成的代理方法上的类。

于 2012-06-11T09:47:22.590 回答
0

会不会MyController.metaClass.invokeMethod是在你定义之后被grails框架覆盖了?

您是否尝试过MyController.metaClass.invokeMethod通过反射检查内容?

于 2012-06-10T19:50:08.153 回答