2008-09-02 16 views
7

मेरी परियोजना वसंत ढांचे 2.5.4 पर आधारित है। और मैं कुछ नियंत्रकों के लिए पहलुओं को जोड़ने की कोशिश करता हूं (मैं पहलू 1.5.3 का उपयोग करता हूं)।Aspectj वसंत ढांचे में सभी घटनाओं को पकड़ नहीं है?

मैं आवेदन-servlet.xml में ऑटो-प्रॉक्सी सक्रिय कर दिया है, बस xml फ़ाइल के अंत तक इन पंक्तियों चिपकाया:

<aop:aspectj-autoproxy /> 
<bean id="auditLogProcessor" class="com.example.bg.web.utils.AuditLogProcessor" /> 

बनाया पहलू:

package com.example.bg.web.utils; 

import org.apache.log4j.Logger; 
import org.aspectj.lang.annotation.After; 
import org.aspectj.lang.annotation.Aspect; 
import org.aspectj.lang.annotation.Pointcut; 

@Aspect 
public class AuditLogProcessor 
{ 
    private final static Logger log = Logger.getLogger(AuditLogProcessor.class); 

    @After("execution(* com.example.bg.web.controllers.assets.AssetThumbnailRebuildController.rebuildThumbnail(..))") 
    public void afterHandleRequest() { 
     log.info("test111"); 
    } 

    @After("execution(* com.example.bg.web.controllers.assets.AssetThumbnailRebuildController.rebuildThumbnail(..))") 
    public void afterRebuildThumbnail() { 
     log.info("test222"); 
    } 
}

मेरे नियंत्रकों:

class AssetAddController implements Controller 
class AssetThumbnailRebuildController extends MultiActionController

जब मैं पहलू सलाहकार में ब्रेक अंक की स्थापना की और नियंत्रकों आह्वान मैं केवल afterHandleRequest पकड़ने() लेकिन रिबल्ड के बाद नहीं थंबनेल() मैंने क्या गलत किया?

नोट

मैं जो इतना बीटा के लिए पहुँच नहीं है मेरे दोस्त की ओर से इस सवाल पूछ रहा हूँ, और मैं एक सुराग क्या यह सब के बारे में है नहीं है।

संपादित

वहाँ वास्तव में थे कुछ गलतियाँ, धन्यवाद Cheekysoft। लेकिन समस्या अभी भी बनी हुई है।

उत्तर

2

आपका breakpoints मारा जा रहा नहीं कर रहे हैं क्योंकि आप वसंत के AOP प्रॉक्सी का उपयोग कर रहे हैं। एओपी प्रॉक्सी विशेष कैसे हैं के विवरण के लिए understanding-aop-proxies देखें।

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

प्राप्त करने के लिए आप क्या चाहते हैं, लोड समय के माध्यम से 'असली' AOP बुनाई (जो वसंत बहुत अच्छी तरह से समर्थन करता है) का उपयोग कर जांच करते हैं।

1

AspectJ स्प्रिंग वेब एमवीसी ढांचे में कक्षाओं के साथ अच्छी तरह से काम नहीं करता है। Read the bottom of the "Open for extension..." box on the right side of the page

इसके बजाय, HandlerInterceptor इंटरफ़ेस पर एक नज़र डालें।

नई वसंत एमवीसी एनोटेशन तब भी काम कर सकती है जब से नियंत्रक कक्षाएं सभी पीओजेओ हैं, लेकिन मैंने इसे स्वयं नहीं किया है।

0

क्या यह वर्तनी के रूप में सरल है? या क्या सवाल में बस टाइप हैं? कभी-कभी आप rebuildThumbnail लिख सकते हैं और कभी-कभी आप rebildThumbnail

लिखने के तरीकों आप सलाह के साथ ओवरराइड करने के लिए कोशिश कर रहे हैं MVC ढांचे में अंतिम तरीकों, इसलिए जबकि bpapas जवाब उपयोगी है नहीं कर रहे हैं, मैं समझता हूँ कि इस समस्या को इस में नहीं है मामला। हालांकि, यह सुनिश्चित करें कि पुनर्निर्माण थंबनेल नियंत्रक कार्रवाई अंतिम नहीं है

@bpapas: अगर मैं गलत हूं तो कृपया मुझे सही करें। प्रोग्रामर की स्वयं की नियंत्रक कार्रवाई वह है जिसे वह ओवरराइड करने का प्रयास कर रहा है। मल्टीएक्शन कंट्रोलर स्रोत (और इसके माता-पिता ') को देखकर संभावित रूप से स्टैक में एकमात्र अंतिम विधि बहुआयामी नियंत्रक.invokeNamedMethod है, हालांकि मुझे 100% निश्चित नहीं है कि यह उस समय स्टैक में होगा या नहीं। क्या एक अंतिम विधि स्टैक को ऊपर उठाएगी जिससे एक विधि को एओपी सलाह को आगे बढ़ाया जा सकता है?

1

मूल सेटअप ठीक दिखता है।

सिंटैक्स को इन-प्लेस पॉइंटकट को परिभाषित न करके थोड़ा सा सरल किया जा सकता है और केवल उस विधि को निर्दिष्ट किया जा सकता है जिसके बाद सलाह दी जानी चाहिए। (तरीकों के लिए नामित पॉइंटकट स्वचालित रूप से आपके लिए बनाए जाते हैं।)

उदा।

@After("com.example.bg.web.controllers.assets.AssetAddController.handleRequest()") 
public void afterHandleRequest() { 
    log.info("test111"); 
} 

@After("com.example.bg.web.controllers.assets.AssetThumbnailRebuildController.rebuildThumbnail()") 
public void afterRebuildThumbnail() { 
    log.info("test222"); 
} 

जब तक पुनर्निर्माण थंबनेल विधि अंतिम नहीं है, और विधि का नाम और वर्ग सही है। मुझे नहीं लगता कि यह क्यों काम नहीं करेगा।

देख http://static.springframework.org/spring/docs/2.0.x/reference/aop.html