【问题标题】:grails override redirect controller methodgrails 覆盖重定向控制器方法
【发布时间】:2011-07-16 01:28:36
【问题描述】:

我正在尝试覆盖默认控制器重定向方法,但似乎无法让以下代码工作。

我已经创建了一个插件,我正在尝试使用“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”但它没有应用启动后,通过控制器进行重定向时不要进入那里。

【问题讨论】:

    标签: grails grails-plugin


    【解决方案1】:

    是的,签名错误 - 重定向采用单个 Map 参数(请参阅 org.codehaus.groovy.grails.plugins.web.ControllersGrailsPlugin.registerControllerMethods() 中的声明)

    应该是这样的

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

    【讨论】:

      【解决方案2】:

      另请注意,如果您希望在修改控制器的源代码后重新应用 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))
        }
      }
      

      【讨论】:

        猜你喜欢
        • 2016-07-28
        • 2018-07-06
        • 2011-11-12
        • 2014-09-07
        • 2020-05-15
        • 1970-01-01
        • 1970-01-01
        • 2015-02-20
        • 2012-04-30
        相关资源
        最近更新 更多