5

我想在我的 Grails 项目中创建一个自定义日志注释。

我的代码:

class MyService{
    @AuditLog
    def method1() {
        println "method1 called"
        method2()
    }
    @AuditLog
    def method2() {
        println "method2 called"
    }
}

拦截器:

class AuditLogInterceptor implements MethodInterceptor {
    @Override
    Object invoke(MethodInvocation methodInvocation) throws Throwable {
        println "${methodInvocation.method}"
        return methodInvocation.proceed();
    }
}

弹簧配置:

aop {
    config("proxy-target-class": true) {
        pointcut(id: "auditLogInterceptorPointcut", expression: "@annotation(xxx.log.AuditLog)")
        advisor('pointcut-ref': "auditLogInterceptorPointcut", 'advice-ref': "auditLogInterceptor")
    }
}

auditLogInterceptor(AuditLogInterceptor) {}

结果:

public java.lang.Object xxx.MyService.method1()
method1 called
method2 called

我也希望看到方法 2 的注释触发。我错过了什么?

4

1 回答 1

8

发生这种情况是因为服务类中对 self 的内部方法调用不是在类的代理实例上完成的service。如果您从应用程序上下文中获取服务 bean 并尝试调用method2(),您应该会看到aspectadvice.

class MyService{
    static transactional = false
    def grailsApplication

    @AuditLog
    def method1() {
        println "method1 called"
        grailsApplication.mainContext.myService.method2()
        //method2()
    }
    @AuditLog
    def method2() {
        println "method2 called"
    }
}
于 2013-07-01T21:59:38.040 回答