2011-02-07 7 views
12

मैं AspectJ उपयोग कर रहा हूँ तरीकों कि @Profile(description="something")AspectJ pointcut पैरामीटर

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.METHOD) 
public @interface Profile { 
    public String description() default ""; 
} 

@Around("com.merc.aop.ctw.aspect.PointcutDefinitions.logAnnotatedMethods(profile)") 
public Object profile(ProceedingJoinPoint pjp, Profile profile) throws Throwable { 
    .... 
} 

@Pointcut("@annotation(com.merc.annotations.Profile)") 
protected void logAnnotatedMethods(Profile profile) { 
} 

से एनोटेट रोकना लेकिन मैं निम्न त्रुटि संदेश मिलता है जबकि एजेसी

formal unbound in pointcut 
+0

हाय, मेरी आवश्यकता आपके जैसा ही है। मुझे एक संदेह है कि 'com.merc.aop.ctw.aspect.PointcutDefinitions.logAnnotatedMethods' क्या है। मैंने देखा है कि आपके द्वारा बनाए गए लॉगअनोटेड मोड्स हैं लेकिन मुझे com.merc.aop.ctw.aspect.PointcutDefinitions क्या नहीं मिल रहा है? कृपया मेरा मार्ग दर्शन कीजिए। – James

उत्तर

14
@Pointcut("@annotation(com.merc.annotations.Profile)") 
protected void logAnnotatedMethods(Profile profile) { 
} 

यह सही नहीं है, @annotation() एक पैरामीटर नाम चाहता है, पैरामीटर प्रकार नहीं।

यदि आपकी कक्षा डीबग कोड के साथ संकलित की गई है, तो पॉइंटकट पैरामीटर के पास विधि पैरामीटर के समान नाम होना चाहिए, यदि नहीं, तो आपको या तो पैरामीटर प्रकारों पर निर्भर होना चाहिए या argNames का उपयोग करके अपने पैरामीटर नामों को स्पष्ट रूप से लिखना होगा पैरामीटर:

@Pointcut(value="@annotation(profile)",argNames="profile") 
protected void logAnnotatedMethods(Profile arg) { } 

संदर्भ:

+0

मैं असहमत हूं। सिर्फ पैरामीटर के रूप में एनोटेशन प्रकार के साथ @annotation का उपयोग किया गया और यह स्प्रिंग 3.1 में एक आकर्षण की तरह काम करता है जैसे कि दस्तावेज़ों को यह कहना चाहिए। http://static.springsource.org/spring/docs/3.0.3.RELEASE/spring-framework-reference/html/aop.html –

+1

असल में, दस्तावेज़ दोनों संस्करणों को निर्दिष्ट करते हैं। आपको इस खंड में मेरा संस्करण मिलेगा: http://static.springsource.org/spring/docs/3.0.3.RELEASE/spring-framework-reference/html/aop.html#aop-ataspectj-advice-params। हालांकि, मैं अन्य संस्करण से अवगत नहीं था। –

+1

लेकिन फिर: यह एक AspectJ सवाल है, वसंत एओपी प्रश्न नहीं, इसलिए वसंत दस्तावेज़ शायद ही प्रासंगिक हैं। लेकिन मैंने इसे एक्शन में पुस्तक आस्पेक्टजे से लिया: '@annotation (TypePattern या ObjectIdentifier)' जो फिर से दिखाता है कि हम दोनों सही हैं, जैसे वसंत एओपी में –

5
का उपयोग कर compileing

मैं चारों ओर खेल रहा था और पाया गया कि निम्नलिखित

@Pointcut("@annotation(profile)") 
protected void logAnnotatedMethods(Profile profile) { 
}