2011-06-17 16 views
6

मैंने @ पहलू एनोटेशन का उपयोग करके अपने पहलुओं की घोषणा की है, लेकिन सलाह लागू नहीं होती है। पहलू मेरे पास कुछ अन्य परियोजनाओं में काम करता है, और मुख्य अंतर यह प्रतीत होता है कि अन्य परियोजनाएं एनोटेशन का उपयोग करके पूरी तरह से वायर्ड हैं, और यह विशेष परियोजना एक्सएमएल वायर्ड है। वादा किया गया एकमात्र बीन पहलू है। तो मैं सोच रहा हूं कि वसंत के पहलू समर्थन, जब पहलू-ऑटोप्रोक्सी का उपयोग करते समय यह आदेश दिया जाता है कि बीन्स को एक्सएमएल में परिभाषित किया गया है।पहलू और वसंत पहलू-ऑटोप्रोक्सी

उदाहरण के लिए, एक्सएमएल में पहलू-ऑटोप्रोक्सी के बाद घोषित बीन्स एओपी पॉइंटकट के लिए विचार किया जाएगा?

संपादित करें:

मैं जब तक के बाद सभी सेम बनाई गई हैं और फिर भी प्रयास विफल <aop:aspectj-autoproxy /> ले जाया गया।

असल में मेरी कोड के होते हैं:

@Component 
@Aspect 
public class SomeAspect { 
    @Pointcut("@annotation(MyAnnotation)") 
    public void isX() {} 

    @After("isX()") 
    public void XX() { 
     System.out.println("Called aspect"); 
    } 
} 

और मेरे नियंत्रक की तरह कुछ है:

public class XController extends AbstractCommandController { 
    @MyAnnotation 
    public void handleX(...) { 
     // do stuff 
    } 
    @Override 
    protected void handle(...) { 
     return handleX(...); 
    } 
} 

और फिर वसंत एक्सएमएल है:

<context:component-scan base-package="package.of.some.aspect" /> 
<aop:aspectj-autoproxy /> 

<!-- the rest of the beans below --> 
<bean id="someController" class="..." /> 

मेरे पिछले परियोजनाओं पर कब्जा कर लिया और घटक-स्कैन के माध्यम से सभी सेम लोड किया। इस बार यह अलग है।

EDIT2: दूसरा अंतर यह है कि अन्य परियोजनाएं @ नियंत्रक, और @RequestMethod का उपयोग कर रही हैं। और इस मामले में मैं AbstractCommmandController की व्युत्पन्न कक्षा का उपयोग कर रहा हूं। मुझे आश्चर्य है कि यह लागू होता है: http://forum.springsource.org/archive/index.php/t-46637.html

अर्थात् हैं कि मैं handleRequest() को छोड़कर किसी भी विधि को सलाह लागू नहीं कर सकता।

EDIT3:

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

+0

कृपया कुछ कोड पोस्ट करें; जैसे एपकोटेक्स्ट जो पहलू, सलाह और पॉइंटकट को परिभाषित करता है। – abalogh

+0

@abalogh: मुझे लगता है कि अगर मैं कोड को सरल बनाउंगा तो मुझे लगता है कि यह काम करेगा। पहलू/वसंत डीबग करने के बारे में जाने का सबसे अच्छा तरीका क्या है जब यह सामान अपेक्षित काम नहीं करता है? – Kevin

उत्तर

3

मुझे लगता है कि आप विधि को उसी श्रेणी में किसी अन्य विधि से सीधे handleX पर कॉल कर रहे हैं। यह नवाचार का सम्मान नहीं करेगा, क्योंकि एओपी एनोटेशन को संसाधित करने का काम एक जेडीके प्रॉक्सी द्वारा किया जाता है जो आपकी कक्षा को लपेटता है और उसी इंटरफेस का खुलासा करता है।

यह संभव है कि आप जेडीके प्रॉक्सी के बजाय CGLIB का उपयोग करके इस पर काम कर सकें, लेकिन मेरे अनुभव में, सबसे विश्वसनीय समाधान आंतरिक रूप से बुलाए जाने वाले तरीकों के लिए किसी भी एओपी एनोटेशन पर भरोसा नहीं करना है।

+0

हाँ, मैं अब समझता हूं। लेकिन मैं वसंत की हैंडल() विधि को या तो सुरक्षित नहीं कर सकता क्योंकि यह संरक्षित है, और वैसे भी यह एक आंतरिक विधि भी है (!)। यह विधि नहीं है कि वसंत "बाहरी रूप से" कहता है। लेकिन मैं जो हासिल करना चाहता हूं वह है सभी नियंत्रकों के उप-समूह के लिए सलाह को रोकना और लागू करना। मैं वास्तव में नहीं देखता कि मैं @ नियंत्रक/@ अनुरोध विधि का उपयोग किए बिना ऐसा करने जा रहा हूं। सुझाव? – Kevin

+0

मैं इसे सही उत्तर के रूप में चिह्नित करूंगा, लेकिन दो मुद्दे थे।सबसे पहले मुझे सार्वजनिक विधि हैंडल्यूक्वेट को ओवरराइड करना पड़ा और वहां मेरी एनोटेशन डालना पड़ा। और दूसरा पहलू-ऑटोप्रोक्सी केवल सभी बीन्स तत्काल होने के बाद ही होने की आवश्यकता होती है। फिर सब कुछ काम करता है। – Kevin

+0

ईमानदार होने के लिए मैंने पहलू-ऑटोप्रोक्सी का उपयोग नहीं किया है। मैं ज्यादातर अन्य एओपी एकीकरण का उपयोग कर रहा हूं (@ ट्रांसेक्शनल, कुछ स्प्रिंग सिक्योरिटी सामान इत्यादि)। मेरे सहयोगियों में से एक को एक मुद्दा मिला कि स्प्रिंग सिक्योरिटी एनोटेशन को @RequestMapping के साथ नियंत्रक विधियों पर सम्मान नहीं माना जाता है। मुझे आश्चर्य है कि क्या इससे संबंधित है। – Dan

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