2011-03-15 94 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  
    } 
} 

我簽名錯了還是錯過了什麼?我這樣做的原因是我想改變重定向的URI如果滿足某些條件,但與日誌/打印語句我看到它是在應用程序啓動/編譯時「replaceRedirectMethod」,但它doesn一旦應用程序啓動後,通過控制器進行重定向時,不會進入此處。

回答

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)) 
    } 
}