2010-06-23 17 views
8

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

अब मैं एक ऐसा पहलू रखना चाहता हूं जो अनुमतियों की जांच करता है, सेवा कॉल करता है और कुछ विफल होने पर विफलता कोड के साथ प्रतिक्रिया ऑब्जेक्ट देता है। समस्या यह है: मुझे यह जानने की ज़रूरत है कि किस प्रकार का प्रतिक्रिया ऑब्जेक्ट बनाना है। क्या कोई पॉइंटकट अभिव्यक्ति है जो मुझे रिटर्न प्रकार तक पहुंच प्रदान करती है? ऐसा कुछ, शायद?

@Around(value = "execution(public *" 
    + " com.mycompany.MyService+.*(..))" 
    + " && args(request)" 
    + " && returning(returnType)" // something like this would be nice 

, argNames = "request,returnType") 
public Object handleServiceCall(final ProceedingJoinPoint pjp, 
    final Request request, 
    final Class<? extends Response> returnType){ ... } 
+0

तो आप एक ही पहलू के साथ कई विधियों की सलाह देना चाहते हैं, जिन्हें कभी-कभी सेवा कॉल किए बिना प्रतिक्रिया ऑब्जेक्ट का उत्पादन करने और वापस करने की आवश्यकता होती है, और यह प्रतिक्रिया ऑब्जेक्ट सेवा विधि के लिए उचित उप प्रकार का होना चाहिए? –

+0

yup, यह वही है जो मैं चाहता हूं कि –

उत्तर

6

JoinPoint के लिए जावाडोक एक getSignature() विधि, जिसका वापसी प्रकार Signature एक उप इंटरफ़ेस है उल्लेख है MethodSignature आप कास्टिंग करने का प्रयास कर सकते हैं, जिसमें एक विधि getReturnType() है, जो हो सकता है कि आप जो खोज रहे हैं।

+0

मुझे इस बारे में पता है। अगर कोई बेहतर समाधान मौजूद नहीं है, तो मैं इस तरह से जाने के लिए तैयार हूं, लेकिन मैं पॉइंटकट अभिव्यक्ति पसंद करूंगा। –

0

आप (आपके मामले में handleServiceCall()) के आसपास सलाह विधि के अंदर है कि जांच कर सकते हैं

Object actuals = pjp.proceed(); 
if(actuals instanceof MyResponse){ 
//TO:DO: Your code here 
} 
+0

मुझे पता है, लेकिन इससे मदद नहीं मिलेगी, क्योंकि मैं हमेशा pjp.proceed() नहीं करता। यदि मेरा पहलू यह निर्णय लेता है कि उपयोगकर्ता को सेवा कॉल निष्पादित करने का अधिकार नहीं है, तो यह आगे बढ़े बिना प्रतिक्रिया ऑब्जेक्ट तैयार करेगा। –

+0

पॉइंटकट अभिव्यक्ति में '*' को 'रेट-टाइप-पैटर्न' के रूप में उपयोग न करें। इसके बजाय उस विधि के वास्तविक रिटर्न प्रकार का उपयोग करें जिसे आप अवरुद्ध करना चाहते हैं। – chedine

+0

कोई अच्छा नहीं: मैं कई अलग-अलग रिटर्न प्रकारों को रोकना चाहता हूं, और मैं जानना चाहता हूं कि मेरे पास कौन सा है। –

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