我正在尝试在 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 中有可用的控制器拦截器和过滤器,但这些并没有真正集中我想要实现的目标,并且试图为某些集中行为创建一个简单的通用函数
任何关于为什么这在控制器上不起作用的指导将不胜感激,谢谢
您的方法适用于通过 Groovy 元类机制进行的方法调用,但在 Grails 2 中,这不适用于控制器操作 - 它们是使用普通的 Java 反射来调用的(java.lang.reflect.Method.invoke
),因此您的自定义invokeMethod
被绕过。
如果您想要一个既适用于来自 Java 又适用于来自 Groovy 的调用的 AOP 机制,您可能必须使用诸如 AspectJ 加载时编织之类的东西。 Spring 的基于代理的 AOP 可能可以工作,但是 Grails 2 控制器系统依赖于具有特定的操作方法。@Action
注解(在编译时通过 AST 转换添加),我不知道 Spring AOP 代理是否在生成的代理方法上保留目标类的方法注解。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)