2011-03-15 13 views
5

Estoy intentando anular el método predeterminado de redirección del controlador y parece que no puede funcionar el siguiente bit de código.grails anula el método del controlador de redireccionamiento

He creado un complemento y estoy tratando de usar el "doWithDynamicMethods" para reemplazar el redireccionamiento.

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

¿Tengo la firma incorrecta o me falta algo? La razón por la que estoy haciendo esto es que me gustaría cambiar el uri de la redirección si se cumple una determinada condición, pero con las sentencias de registro/impresión veo que va en el "replaceRedirectMethod" al inicio/compilación de la aplicación, pero no funciona Entra cuando realizas una redirección a través del controlador una vez que se inicia la aplicación.

Respuesta

3

Sí, la firma está mal - redirección toma un solo Map de parámetros (véase la declaración de org.codehaus.groovy.grails.plugins.web.ControllersGrailsPlugin.registerControllerMethods())

lo que debe ser

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

También tenga en cuenta que si desea que el redirect método de reemplazo de volver a aplicar después de modificar el código fuente de un controlador, debe hacer lo siguiente:

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