2015-08-24 9 views
6

के लिए ट्रिगर नहीं कर रहा है मैंने एक पहलू बनाया है जो यह सुनिश्चित करने के लिए मूल आईडी तुलना करता है कि उपयोगकर्ता एक ही समूह से संबंधित है जिसने इकाई को अनुरोध किया है। मैंने अपने पहलू को @Service विधियों से जोड़ने में सफलता प्राप्त की है, लेकिन यह सेवा परत पर समझ में नहीं आता है, और मुझे इसकी बजाय @RestController विधियों से जुड़ने की आवश्यकता है। जब मैं ऐसा करने का प्रयास करता हूं, सब कुछ अच्छा लगता है, लेकिन मेरा पहलू कभी ट्रिगर नहीं होता है, और लॉग चुप हैं।स्प्रिंग 4 एओपी @ आस्पेक्ट @RestController

pom.xml

<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-aop</artifactId> 
    <version>4.1.7.RELEASE</version> 
</dependency> 

वसंत संदर्भ

<context:annotation-config/> 
<context:component-scan base-package="my.pkg"/> 
<aop:aspectj-autoproxy/> 
<aop:config proxy-target-class="true"/> 

पहलू

@Aspect 
@Component 
public class MyAspect { 
    @Pointcut("within(@org.springframework.stereotype.Controller *)") 
    public void controller() {} 

@Pointcut("within(@org.springframework.web.bind.annotation.RestController *)") 
    public void restController() {} 

    @Pointcut("args(java.security.Principal,..)") 
    public void principalArgPointcut() {} 

    @Around("(controller() || restController()) && principalArgPointcut()") 
    public Object validate(ProceedingJoinPoint point) throws Throwable { 
     doValidationBefore(); 
     Object result = point.proceed(); 
     doValidationAfter(); 

     return result; 
    } 
} 

जहां "doValidationBefore()" और "doValidationAfter()" एक अपवाद फेंक होगा सत्यापन विफल हो जाता है, तो ।

और अंत में, मेरी RestController

@RestController 
@RequestMapping("/my-path") 
public class MyController { 
    @RequestMapping(value = "/{entityId}", method = RequestMethod.GET) 
    public @ResponseBody 
    ResponseEntity<MyEntity> getEntityDetails(Principal principal, @PathVariable("entityId") Long entityId) { 
     return new ResponseEntity(HttpStatus.OK); 
    } 
} 

नोट करने के लिए कुछ बातें:

  • यह सही पहलू काम करता है जब मैं निष्पादन पैटर्न सेवाओं से मेल खाते हैं और मेरी सेवा पैकेज में यह जगह करने के लिए बदल जाते हैं।
  • पहलू और बाकी नियंत्रक एक ही संदर्भ में हैं
  • मैं आईडीईए आईडीई का उपयोग करता हूं, और जब मैं पहलू पर "सलाह दी गई विधियों पर नेविगेट" आइकन का उपयोग करता हूं, तो जिस विधि का मैं परीक्षण कर रहा हूं वह विधियों की सूची में सूचीबद्ध है ।
  • "की सलाह दी तरीकों पर नेविगेट" में सूचीबद्ध तरीकों में से कोई भी काम कर रहे हैं

बातें मैं कोशिश की है: org.aspectj: aspectjrt

  • मैं अपने pom.xml करने के लिए 3 पुस्तकालयों कहा: 1.8.6, org.aspectj: aspectjtools: 1.8.6, cglib: cglib: 2.2.2। इनमें से कोई भी कोई फर्क नहीं पड़ता।
  • मैंने अपने आस्पेक्ट और पॉइंटकूट को संदर्भ xml में सीधे परिभाषित करने और एनोटेशन को हटाने की कोशिश की, कोई फर्क नहीं पड़ता।
  • मैंने सभी विधियों पर लागू करने के लिए अपना निष्पादन पैटर्न सेट करने का प्रयास किया है, और यह अभी भी ट्रिगर नहीं हुआ है।
  • मैंने अपने RestController के लिए एक इंटरफ़ेस जोड़ने की कोशिश की, कोई बदलाव नहीं।

मुझे यहां कुछ मदद चाहिए, क्योंकि मैं इसे कुछ समय से हल करने की कोशिश कर रहा हूं। मुझे पता है कि यह संभव होना चाहिए।

उत्तर

6

जैसा कि यह पता चला है, मेरे पहलू और मेरे नियंत्रक वास्तव में एक ही संदर्भ में नहीं थे।

मैं अपने नियंत्रकों का मानना ​​था जबकि मेरे वेब context.xml के संदर्भ स्कैनिंग में शामिल किए जाने, वे वास्तव में वेब-INF/सर्वलेट-context.xml

में स्कैन किया जा रहा था एक बार मैं करने के लिए मेरे पहलू विन्यास ले जाया गया वेब-आईएनएफ/सर्वलेट-context.xml, मेरे पहलू अपेक्षित के रूप में ट्रिगर करना शुरू किया।

उन सभी के लिए धन्यवाद जिन्होंने मेरी समस्या पर विचार किया।

+0

एक ही समस्या का सामना करना और कारण नहीं मिल रहा है। कोई सुझाव जिस पर विन्यास जांचने के लिए? –

+0

आपने मेरा दिन बचाया। मैंने आपकी पोस्ट पढ़ने तक निराश लेकिन बहुत निराश किया। आपका बहुत बहुत धन्यवाद – anhtuangv

0

यह सुनिश्चित करने के लिए चित्रित करें कि आपकी सेवा वसंत में कहां कॉन्फ़िगर की जा रही है। यदि आपके पास है तो एक आइकन है जिसे आप वसंत बीन कॉन्फ़िगरेशन पर नेविगेट करने के लिए क्लिक कर सकते हैं। फिर सुनिश्चित करें कि पहलू एक ही फ़ाइल में कॉन्फ़िगर किया गया है।

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

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