Grails:围绕方法代理的各种问题

时间:2014-06-16 23:26:49

标签: spring grails groovy

我的公司正在尝试实施审计服务,如果该方法使用特定注释进行注释,则该服务将拦截对服务的方法调用。例如:

class FooService {

  @Audit
  void pleaseAuditMe() {
    // some important code
  }
}

我们实现这一目标的第一步是使用Spring AOP来围绕AOP代理来包装带注释的方法,这将记录我们在执行方法之前和之后所需的审计数据。虽然我们能够使审计工作,但解决方案并不好,因为如果检查了异常类型并且未在代理方法上声明异常类型,则AOP代理将包装使用UndeclaredThrowableException抛出的任何异常。鉴于Groovy和Grails的性质(即通常不会声明已检查的异常),通过并在所有方法上声明确切的异常类型确实没有意义。

或者,我们尝试通过元类mixin实现功能。在完成这项工作后,我们意识到CompileStatic上下文中的任何方法调用都不会通过元类,因此不会调用我们的代理逻辑。

这似乎一定是一个解决了问题的问题'在Grails世界,但我们还没有能够弄明白。我们想要:

一种解决方案,它允许我们代理方法调用,而不会强制我们重写所有的异常处理/声明,而且无论我们是否在编译静态上下文中,它都能正常工作。

1 个答案:

答案 0 :(得分:0)

您可以使用由您的审核注释触发的AST转换来执行此操作。这是Grails的最新版本对Transactional注释的处理。这样可以避免使用运行时代理,并且如果正确完成,则完全可以使用CompileStatic。