2011-08-27 13 views
6

का उपयोग कर रिकर्सन मैं एस्पेक्टजे के लिए काफी नया हूं और एक समस्या है जिसके बावजूद कुछ शोध मैं ठीक करने में सक्षम नहीं हूं। मेरे पास बैंक से संबंधित निम्नलिखित पहलू है, पहलू यह जांचता है कि बैंक की शेष राशि प्रत्येक सार्वजनिक विधि के आमंत्रण के बाद रखती है या नहीं।AspectJ

pointcut BankCheck(Bank bank): call(public * Bank.*(..)) && target(bank); 

Object around(Bank bank): BankCheck(bank) { 
    int balance = bank.getTotalBalance(); 
    Object result = proceed(bank); 
    if (balance != bank.getTotalBalance()) { 
     LOGGER.warn("The total balance of the bank is not equal."); 
    } else { 
     LOGGER.info("Ok"); 
    } 
    return result; 
} 

समस्या यह है कि पहलू में मैं विधि bank.getTotalBalance() जो अपने आप में एक सार्वजनिक बैंक तरीका है का उपयोग करें। इसलिए हर बार पहलू की सलाह दी जाती है और जब तक अपवाद नहीं होता है तब तक यह रिकर्सन समस्या चलती रहती है। क्या इसे ठीक करने का कोई तरीका है, उदाहरण के लिए पहलू के अंदर सलाह तंत्र को बंद कर?

उत्तर

4

इस प्रयास करें:

public aspect BankTotalBalanceAspect { 
    pointcut BankCheck(Bank bank): call(public * Bank.*(..)) && target(bank); 

    Object around(Bank bank): BankCheck(bank) && !within(BankTotalBalanceAspect) { 
     int balance = bank.getTotalBalance(); 
     Object result = proceed(bank); 
     if (balance != bank.getTotalBalance()) { 
      LOGGER.warn("The total balance of the bank is not equal."); 
     } else { 
      LOGGER.info("Ok"); 
     } 
     return result; 
    }  
} 
+2

धन्यवाद, यह वही है जो मैं ढूंढ रहा था। –

0

मैं एस्पेक्टजे पॉइंटकट सिंटैक्स से बहुत परिचित नहीं हूं, लेकिन क्या आपके पास getTotalBalance कॉल को आपकी पॉइंटकट परिभाषा से बाहर करने का कोई तरीका है? यह रिकर्सन होने से रोक देगा।

इसके अलावा, आपकी पॉइंटकट परिभाषा बहुत व्यापक रूप से मेल खाती है: मुझे लगता है कि आपके पहलू में लागू शेष राशि को लिखने के लिए निष्पादित किया जाना चाहिए। तो getTotalBalance जैसे एक पठनीय कॉल को वैसे भी मिलान नहीं किया जाना चाहिए। क्या आपके पास लक्ष्य वर्ग में ईमानदारी से और लिखने के तरीकों के बीच अंतर करने का एक तरीका है, ई। जी। मौजूदा लेनदेन एनोटेशन या उस तरह से कुछ?

यदि नहीं, तो आप खुद को ऐसे (कस्टम) एनोटेशन पेश करना चाहेंगे और सभी सार्वजनिक विधि कॉलों से मेल खाने के लिए अपने पॉइंटकट को एडजस्ट कर सकते हैं जिन्हें रीडोनली के रूप में चिह्नित नहीं किया गया है। लेकिन इसका मतलब लक्ष्य वर्ग में कोड को संशोधित करना होगा, जो हमेशा एक विकल्प नहीं होता है। लेकिन वाईएमएमवी।

+0

यह वास्तव में कुछ कस्टम व्याख्याएं किए जाने और समस्या यह है कि जिस तरह से ठीक करने के लिए संभव हो जाएगा। @ कॉन्स्टेंटिनर समाधान के बावजूद बहुत आसान है। धन्यवाद वैसे भी –

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