2008-11-05 14 views
6

में पैरामीटर मैं एस्पेक्टजे का उपयोग उन सभी सार्वजनिक तरीकों की सलाह देने के लिए कर रहा हूं जिनके पास चुने हुए वर्ग का तर्क है। मैंने कोशिश की है:AspectJ: पॉइंटकट

public void delete(Object item, Session currentSession); 

लेकिन ऐसा लगता है तरीकों के साथ काम नहीं करता है:

public List listAll(Session currentSession); 

मैं कैसे हो सकता है

यह कम से कम 2 तर्क के साथ तरीकों के लिए अद्भुत काम कर रहा है दोनों विधियों के निष्पादन की सलाह देने के लिए मेरे पॉइंटकट को बदलें? दूसरे शब्दों में: मुझे उम्मीद है कि ".." वाइल्डकार्ड "शून्य या अधिक तर्क" का प्रतिनिधित्व करेगा, लेकिन ऐसा लगता है कि इसका अर्थ है "एक या अधिक" ...

उत्तर

7

ओह ठीक है ... मैंने इसके साथ काम किया यह बुरा चाल है। अभी भी किसी के लिए "आधिकारिक" पॉइंटकट परिभाषा के साथ दिखने का इंतजार है।

pointcut permissionCheckMethods(EhealthSession eheSess) : 
    (execution(public * *(.., EhealthSession)) && args(*, eheSess)) 
    && !within(it.___.security.PermissionsCheck); 

pointcut permissionCheckMethods2(EhealthSession eheSess) : 
    (execution(public * *(EhealthSession)) && args(eheSess)) 
    && !within(it.___.security.PermissionsCheck) 
    && !within(it.___.app.impl.EhealthApplicationImpl); 

before(EhealthSession eheSess) throws AuthorizationException : permissionCheckMethods(eheSess) 
{ 
    Signature sig = thisJoinPointStaticPart.getSignature(); 
    check(eheSess, sig); 
} 

before(EhealthSession eheSess) throws AuthorizationException : permissionCheckMethods2(eheSess) 
{ 
    Signature sig = thisJoinPointStaticPart.getSignature(); 
    check(eheSess, sig); 
} 
4

कैसे के बारे में:

pointcut permissionCheckMethods(Session sess) : 
(execution(public * *(..)) && args(.., sess)); 

मुझे लगता है कि अगर पिछले (या केवल) तर्क प्रकार सत्र की है इस से मेल खाएगी। तर्कों की स्थिति को स्वैप करके आप पहले या केवल मिलान कर सकते हैं। लेकिन मुझे नहीं पता कि किसी भी मनमानी स्थिति से मेल खाना संभव है या नहीं।

+0

किसी भी मनमानी स्थिति से मेल नहीं करना संभव नहीं है। –

3

मैं आपके लिए AspectJ वाक्यविन्यास नहीं बढ़ा सकता, लेकिन मैं एक वर्कअराउंड प्रदान कर सकता हूं। लेकिन सबसे पहले मुझे समझाएं कि एक बिंदु में args परिभाषा के साथ आप क्या करना संभव नहीं है: क्योंकि यदि आप विधि हस्ताक्षर के भीतर किसी भी स्थान पर अपने EhealthSession पैरामीटर से मेल खाते हैं, तो AspectJ को इस मामले को कैसे संभालना चाहिए कि हस्ताक्षर में एकाधिक पैरामीटर हैं वह वर्ग? eheSess का अर्थ संदिग्ध होगा।

अब कामकाज: यह धीमा हो सकता है - यह आपके पर्यावरण पर कितना निर्भर करता है, बस इसका परीक्षण करें - लेकिन आप पॉइंटकट को अपनी पैरामीटर सूची के बावजूद सभी संभावित तरीकों से मिलान कर सकते हैं और फिर सलाह को आपको आवश्यक पैरामीटर ढूंढने दें

pointcut permissionCheckMethods() : execution(public * *(..)); 

before() throws AuthorizationException : permissionCheckMethods() { 
    for (Object arg : thisJoinPoint.getArgs()) { 
     if (arg instanceof EhealthSession) 
      check(arg, thisJoinPointStaticPart.getSignature()); 
    } 
} 

पुनश्च:: पैरामीटर सूची का निरीक्षण से हो सकता है आप within(SomeBaseClass+) या within(*Postfix) या within(com.company.package..*) के माध्यम से ध्यान केंद्रित संकीर्ण इतनी के रूप में पूरे ब्रह्मांड को सलाह लागू करने के लिए नहीं कर सकते।

2

आप इस प्रकार का उपयोग करने के अंत में (डबल अंक) और शुरुआत है ..:

pointcut permissionCheckMethods(Session sess) : 
    (execution(public * *(.., Session , ..))); 

इसके अलावा && args(*, sess) बंद छुटकारा क्योंकि इसका मतलब है कि आप केवल के लिए जो कुछ भी प्रकार के साथ उन तरीकों को पकड़ने के लिए उम्मीद मिलता है पहले परम लेकिन sess दूसरे परम के रूप में और 2 से अधिक पैरा भी नहीं ..

+0

@ मॅनरिको कोराज़ी आपको इसे अपनी समस्या के समाधान के रूप में चिह्नित करना चाहिए। तो दूसरों को अन्य कामों से अलग नहीं किया जाएगा – Iomanip

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