मेरे पास जावा 6/स्प्रिंग 3 में लागू एक सर्विस क्लास है जिसे भूमिका से पहुंच प्रतिबंधित करने के लिए एनोटेशन की आवश्यकता होती है।स्प्रिंग एओपी पॉइंटकट जो इंटरफेस पर एनोटेशन से मेल खाता है
मैं एक एनोटेशन कहा जाता RequiredPermission है कि के रूप में अपने मूल्य एक enum बुलाया OperationType से एक या अधिक विशेषता मान को परिभाषित किया है:
public @interface RequiredPermission {
/**
* One or more {@link OperationType}s that map to the permissions required
* to execute this method.
*
* @return
*/
OperationType[] value();}
public enum OperationType {
TYPE1,
TYPE2;
}
package com.mycompany.myservice;
public interface MyService{
@RequiredPermission(OperationType.TYPE1)
void myMethod(MyParameterObject obj);
}
package com.mycompany.myserviceimpl;
public class MyServiceImpl implements MyService{
public myMethod(MyParameterObject obj){
// do stuff here
}
}
मैं भी निम्नलिखित पहलू परिभाषा है:
/**
* Security advice around methods that are annotated with
* {@link RequiredPermission}.
*
* @param pjp
* @param param
* @param requiredPermission
* @return
* @throws Throwable
*/
@Around(value = "execution(public *"
+ " com.mycompany.myserviceimpl.*(..))"
+ " && args(param)" + // parameter object
" && @annotation(requiredPermission)" // permission annotation
, argNames = "param,requiredPermission")
public Object processRequest(final ProceedingJoinPoint pjp,
final MyParameterObject param,
final RequiredPermission requiredPermission) throws Throwable {
if(userService.userHasRoles(param.getUsername(),requiredPermission.values()){
return pjp.proceed();
}else{
throw new SorryButYouAreNotAllowedToDoThatException(
param.getUsername(),requiredPermission.value());
}
}
पैरामीटर ऑब्जेक्ट में उपयोगकर्ता नाम होता है और मैं विधि तक पहुंच की अनुमति देने से पहले उपयोगकर्ता के लिए आवश्यक भूमिका देखना चाहता हूं।
जब मैं MyServiceImpl में विधि पर एनोटेशन डालता हूं, तो सबकुछ ठीक काम करता है, पॉइंटकट मेल खाता है और पहलू काटता है। हालांकि, मेरा मानना है कि एनोटेशन सेवा अनुबंध का हिस्सा है और इंटरफ़ेस के साथ प्रकाशित होना चाहिए एक अलग एपीआई पैकेज। और जाहिर है, मैं दोनों सेवा परिभाषा और कार्यान्वयन (डीआरवाई) पर एनोटेशन डालना नहीं चाहूंगा।
मुझे पता है कि वसंत एओपी में ऐसे मामले हैं जहां एनोटेशन द्वारा पहलुओं को एक इंटरफ़ेस विधियों (जैसे लेनदेन) ट्रिगर किया जाता है। क्या यहां कोई विशेष वाक्यविन्यास है या यह बॉक्स के बाहर सिर्फ असंभव है।
पीएस: मैंने अपनी वसंत कॉन्फ़िगरेशन पोस्ट नहीं की है, क्योंकि ऐसा लगता है कि यह ठीक काम कर रहा है। और नहीं, वे न तो मेरी मूल कक्षा और न ही विधि नाम हैं।
पी पी एस:
<aop:aspectj-autoproxy proxy-target-class="false" />
<bean class="com.mycompany.aspect.MyAspect">
<property name="userService" ref="userService" />
</bean>
तो, अगर मैं सही ढंग से समझ, सबसे अच्छा समाधान है कि आप अपने मूल प्रश्न के लिए मिला (यानी, में एनोटेशन होने इंटरफेस, कार्यान्वयन में नहीं) इंटरफेस में विधि की टिप्पणियों को जानने के लिए सेवा प्रदाता इंटरफेस के पूरे पैकेज से मिलान करना है, और फिर ProceedingJoinPoint पर आत्मनिरीक्षण करना है? क्या यह भी संभव है? यह एक महान धागा है, और एक ही प्रश्न के साथ एक नया शुरू नहीं करना चाहता! धन्यवाद!! – espinchi
@espinchi वास्तव में मैं इतना निराश था कि मैंने इंटरफ़ेस से कार्यान्वयन कक्षा में सभी टिप्पणियों की प्रतिलिपि बनाई और लागू किया कि एक कठोर यूनिट परीक्षण के साथ जो दोनों इंटरफेस पर सभी विधियों की जांच करता है और समान एनोटेशन के लिए कक्षा को कार्यान्वित करता है। बिल्कुल नहीं, एओपी, मुझे पता है। मैं कहूंगा कि यह विश्वसनीय रूप से काम नहीं करता है, सभी –