Как переопределить перенаправление контроллера Grails 3

Я хочу переопределить (расширить) метод перенаправления контроллера Grails 3.

В Grails 2 это было сделано путем переопределения метода через метакласс. См. раздел Переопределить метод перенаправления Grails.

Начиная с Grails 3 это больше не работает.

Чего я хочу достичь: я хочу манипулировать картой аргументов, которая передается методу перенаправления каждого контроллера, который я реализовал (отфильтровано по имени пакета)

Или, если быть более конкретным: я хочу добавить/изменить параметр сопоставления на основе небольшой логики.


person Bernhard    schedule 27.01.2018    source источник


Ответы (2)


Я хочу переопределить (расширить) метод перенаправления контроллера Grails 3.

Вы можете просто переопределить метод в соответствии с обычными языковыми правилами...

class DemoController {

    // ...

    void redirect(Map m) {
        // do whatever you like here...
    }
}

Если вы хотите вызвать исходный метод redirect, вы тоже можете это сделать, но вам нужно будет явно реализовать трейт Controller...

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
    }
}
person Jeff Scott Brown    schedule 28.01.2018
comment
Исходный вопрос включает в себя контроллер Grails 3, что означает, что вы хотите сделать это только в 1 контроллере. Подход, который я бы использовал в этом случае, описан выше. Если вы хотите применить тот же метод к множеству контроллеров, у вас есть ряд других вариантов, некоторые из которых также включают трейты. - person Jeff Scott Brown; 29.01.2018
comment
Спасибо за ответ Джефф. Извините, что не описал это более подробно. Ваше второе решение идет больше в том направлении, которое я себе представлял. Мне все еще нужно нормальное поведение редиректа - я просто хочу его расширить. Я хочу переопределить перенаправление для каждого из моих классов контроллеров с той же функциональностью. Чтобы следовать принципу DRY, я бы создал абстрактный класс, реализующий свойство Controller, и позволил бы каждому из моих контроллеров наследовать его? - person Bernhard; 30.01.2018
comment
Чтобы следовать принципу DRY, я бы создал абстрактный класс, реализующий свойство Controller, и позволил бы каждому из моих контроллеров наследовать его? - Это может сработать, но я думаю, что лучше поместить эту логику в трейт вместо абстрактного класса. - person Jeff Scott Brown; 30.01.2018

Вы можете попробовать преобразование AST с аннотацией типа и GroovyASTTransformation. Например: взгляните на аннотацию - groovy.transform.Sortable, которая внедряет метод compareTo с использованием org.codehaus.groovy.transform.SortableASTTransformation.

person Mamun Sardar    schedule 28.01.2018