2013-07-01 6 views
5

मैं अपने Grails प्रोजेक्ट में एक कस्टम लॉगिंग एनोटेशन बनाना चाहता हूं।Grails के साथ AOP

मेरे कोड:

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(); 
    } 
} 

स्प्रिंग config:

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 के लिए एनोटेशन आग भी देखना चाहता हूं। मैं क्या खो रहा हूँ?

उत्तर

8

ऐसा इसलिए होता है क्योंकि सर्विस क्लास में आंतरिक विधि कॉल service कक्षा के प्रक्षेपित उदाहरण पर किया गया है। यदि आप एप्लिकेशन संदर्भ से सेवा बीन प्राप्त करते हैं और method2() पर कॉल करने का प्रयास करते हैं तो आपको 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

अच्छी अंतर्दृष्टि! मुझे लगता है कि यह बहुत अच्छा होगा अगर Grails प्रॉक्सी कक्षा में एक ही सेवा कक्षा में विधियों को कॉल करने के लिए कुछ जादू प्रदान करता है। –

संबंधित मुद्दे