如何覆盖Grails3控制器的重定向

如何覆盖Grails3控制器的重定向,grails,grails-3.0,grails-3.3,Grails,Grails 3.0,Grails 3.3,我想覆盖(扩展)Grails3控制器的重定向方法 在Grails2中,这是通过元类重写方法实现的。看 自从Grails3以来,这就不再有效了 我想要实现的是:我想要操作传递给我实现的每个控制器的重定向方法的参数映射(按包名过滤) 或者更具体地说:我想基于一些小逻辑添加/更改映射参数您可以尝试使用类型注释和GroovyASTTransformation进行AST转换。例如:看一下-groovy.transform.Sortable注释,它使用org.codehaus.groovy.transfor

我想覆盖(扩展)Grails3控制器的重定向方法

在Grails2中,这是通过元类重写方法实现的。看

自从Grails3以来,这就不再有效了

我想要实现的是:我想要操作传递给我实现的每个控制器的重定向方法的参数映射(按包名过滤)


或者更具体地说:我想基于一些小逻辑添加/更改映射参数

您可以尝试使用类型注释和
GroovyASTTransformation进行AST转换
。例如:看一下-
groovy.transform.Sortable
注释,它使用
org.codehaus.groovy.transform.SortableASTTransformation
比较方法注入到
方法中,您可以使用类型注释和
GroovyASTTransformation
尝试AST转换。例如:看看-
groovy.transform.Sortable
注释,它使用
org.codehaus.groovy.transform.SortableASTTransformation

我想覆盖(扩展)Grails3的重定向方法 控制器

您可以简单地按照通常的语言规则重写该方法

class DemoController {

    // ...

    void redirect(Map m) {
        // do whatever you like here...
    }
}
如果您想调用原始的
重定向
方法,您也可以这样做,但是您需要显式地实现
控制器
特性

import grails.artefact.Controller

class DemoController implements Controller {

    void redirect(Map m) {
        // do whatever you like here before
        // invoking the original redirect...

        // invoke the original redirect...
        Controller.super.redirect m
    }
}
我想覆盖(扩展)Grails3的重定向方法 控制器

您可以简单地按照通常的语言规则重写该方法

class DemoController {

    // ...

    void redirect(Map m) {
        // do whatever you like here...
    }
}
如果您想调用原始的
重定向
方法,您也可以这样做,但是您需要显式地实现
控制器
特性

import grails.artefact.Controller

class DemoController implements Controller {

    void redirect(Map m) {
        // do whatever you like here before
        // invoking the original redirect...

        // invoke the original redirect...
        Controller.super.redirect m
    }
}

最初的问题包括“Grails3控制器”,这意味着您只希望在1个控制器中执行此操作。我将在这种情况下使用的方法如上所述。如果你想将同样的方法应用到众多的控制器上,你有很多其他的选择,其中一些还涉及到特性。谢谢你的回答杰夫。很抱歉没有更详细地描述这一点。你的第二个解决方案更符合我的想象。我仍然需要重定向的正常行为-我只是想扩展它。我想用相同的功能覆盖我的每个控制器类的重定向。为了遵循DRY原则,我将创建一个实现控制器特性的抽象类,并让我的每个控制器继承它?“为了遵循DRY原则,我将创建一个实现控制器特性的抽象类,并让我的每个控制器继承它?”-这可能行得通,但我认为将该逻辑放在trait中而不是抽象类中是一个更好的主意。最初的问题包括“grails 3控制器”,这意味着您只想在1个控制器中执行此操作。我将在这种情况下使用的方法如上所述。如果你想将同样的方法应用到众多的控制器上,你有很多其他的选择,其中一些还涉及到特性。谢谢你的回答杰夫。很抱歉没有更详细地描述这一点。你的第二个解决方案更符合我的想象。我仍然需要重定向的正常行为-我只是想扩展它。我想用相同的功能覆盖我的每个控制器类的重定向。为了遵循DRY原则,我将创建一个实现控制器特性的抽象类,并让我的每个控制器继承它?“为了遵循DRY原则,我将创建一个实现控制器特性的抽象类,并让我的每个控制器继承它?”-这可能行得通,但我认为将这种逻辑放在特征中而不是抽象类中是一个更好的主意。