2011-03-15 5 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"에 표시되지만 리디렉션의 uri를 변경하고 싶습니다. 앱이 시작되면 컨트롤러를 통해 리디렉션을 수행 할 때 거기에 들어 가지 않습니다.

답변

3

예, 서명이 잘못 - 리디렉션 또한주의가

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

해야 하나 Map 매개 변수 (org.codehaus.groovy.grails.plugins.web.ControllersGrailsPlugin.registerControllerMethods()의 선언을 참조) 그래서

소요 당신은에 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)) 
    } 
} 
관련 문제