2011-03-15 8 views
5

मैं डिफ़ॉल्ट नियंत्रक रीडायरेक्ट विधि को ओवरराइड करने का प्रयास कर रहा हूं और काम करने के लिए निम्न कोड को प्राप्त नहीं कर पा रहा हूं।grails रीडायरेक्ट कंट्रोलर विधि ओवरराइड

मैंने एक प्लगइन बनाया है और मैं रीडायरेक्ट को प्रतिस्थापित करने के लिए "doWithDynamicMethods" का उपयोग करने का प्रयास कर रहा हूं।

def doWithDynamicMethods = {ctx -> 
    application.controllerClasses.each() { controllerClass -> 
     replaceRedirectMethod(controllerClass) 
    } 
} 

void replaceRedirectMethod(controllerClass) { 
    def oldRedirect = controllerClass.metaClass.pickMethod("redirect", [Map] as Class[]) 
    controllerClass.metaClass.redirect = { Map args, Map params -> 
     // never seems to get here  
    } 
} 

क्या मेरे पास हस्ताक्षर गलत है या क्या मुझे कुछ याद आ रही है? कारण यह है कि मैं यह कर रहा हूं कि अगर कोई निश्चित शर्त पूरी हो जाती है तो मैं रीडायरेक्ट की यूरी को बदलना चाहता हूं लेकिन लॉगिंग/प्रिंट स्टेटमेंट के साथ मैं देखता हूं कि यह एप्लिकेशन स्टार्टअप/संकलन पर "replaceRedirectMethod" में जा रहा है लेकिन यह नहीं करता है एक बार ऐप शुरू होने के बाद नियंत्रक के माध्यम से रीडायरेक्ट करते समय वहां नहीं जाते।

उत्तर

3

हाँ, हस्ताक्षर गलत है - रीडायरेक्ट एक भी Map पैरामीटर (org.codehaus.groovy.grails.plugins.web.ControllersGrailsPlugin.registerControllerMethods() में घोषणा देखें)

तो यह

controllerClass.metaClass.redirect = { Map args -> 
    // pre-redirect logic 
    oldRedirect.invoke delegate, args 
    // post-redirect logic 
} 
0

होना चाहिए लेता भी ध्यान रखें कि आप के लिए redirect विधि ओवरराइड चाहते हैं नियंत्रक के स्रोत कोड को संशोधित करने के बाद पुनः लागू किया जाना चाहिए, आपको निम्न कार्य करने की आवश्यकता है:

def watchedResources = [ 
    "file:./grails-app/controllers/**/*Controller.groovy"] 

def onChange = { event -> 
    if(!(event.source instanceof Class)) return 

    if(application.isArtefactOfType(ControllerArtefactHandler.TYPE, event.source)) 
    { 
    replaceRedirectMethod(application.getArtefact(ControllerArtefactHandler.TYPE, 
                event.source.name)) 
    } 
}