2013-07-01 11 views
5

Voglio creare un log di annotazione personalizzate nel mio progetto Grails.AOP con Grails

Il mio codice:

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

Interceptor:

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

Primavera config:

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

auditLogInterceptor(AuditLogInterceptor) {} 

Il risultato:

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

Vorrei vedere il fuoco di annotazione per il metodo 2 pure. Cosa mi manca?

risposta

8

Ciò si verifica perché le chiamate interne del metodo nella classe di servizio per l'utente sono non eseguite sull'istanza con proxy della classe service. Se si recupera il fagiolo servizio dal contesto dell'applicazione e tenta di chiamare method2() si dovrebbe vedere il aspect ascolto della advice.

class MyService{ 
    static transactional = false 
    def grailsApplication 

    @AuditLog 
    def method1() { 
     println "method1 called" 
     grailsApplication.mainContext.myService.method2() 
     //method2() 
    } 
    @AuditLog 
    def method2() { 
     println "method2 called" 
    } 
} 
+0

Bella intuizione! Penso che sarebbe bello se Grails fornisce qualche magia di delegare le chiamate ai metodi nella stessa classe di servizio alla classe proxy. –