【发布时间】:2014-06-16 23:26:48
【问题描述】:
我的公司正在尝试实施一个审计服务,如果该方法使用特定注释进行注释,该服务将拦截对该服务的方法调用。例如:
class FooService {
@Audit
void pleaseAuditMe() {
// some important code
}
}
我们实现这一点的第一个尝试是使用 Spring AOP 将带注释的方法与 AOP 代理一起包装,该代理将记录我们在执行方法之前和之后需要的审计数据。虽然我们能够使审计工作,但解决方案并不好,因为如果检查了异常类型并且未在被代理的方法上声明,AOP 代理将包装任何抛出 UndeclaredThrowableException 的异常。鉴于 Groovy 和 Grails 的性质(即通常不声明已检查的异常),在我们所有的方法上遍历并声明确切的异常类型确实没有意义。
另外,我们尝试通过元类 mixins 来实现该功能。完成这项工作后,我们意识到 CompileStatic 上下文中的任何方法调用都不会通过元类,因此不会调用我们的代理逻辑。
这似乎是 Grails 世界中“已解决的问题”,但我们无法弄清楚。我们想要:
一种允许我们代理方法调用而不强制我们重写所有异常处理/声明的解决方案,并且无论我们是否处于编译静态上下文中,它都可以工作。
【问题讨论】: