Grails. Как обрабатывать "смешанные" методы и переменные при использовании @GrailsCompileStatic

Я готов использовать @GrailsCompileStatic аннотации во многих местах моего приложения Граалс 3.1.7. Но главная проблема заключается в том, что не учитывается, что домены, команды и контроллеры "смешиваются" с дополнительными методами (например, save() или же validate()) или переменные (например, g).

Я нашел обходной путь для упомянутых методов: я наследую домены и команды от абстрактного класса, который имеет пустой save() метод (его реализация затем переопределяется с помощью grails, но статическая компиляция не дает сбоя). Также этот абстрактный класс реализует grails.validation.Validateable черта с validate() Реализация метода.

Но есть ли лучший способ включить статическую компиляцию без этих подвохов?

Во многих контроллерах я использую g.createLink() метод. Как я должен пройти g переменная внутри, чтобы избежать этого во время статической компиляции?

Ошибка:(37, 39) Groovyc: [Проверка статического типа] - переменная [g] не объявлена.

2 ответа

Решение

В дополнение к тому, что ответил @andi, просто чтобы добавить решение g.createLink() вопрос:
Вы можете ввести LinkGenerator бин и использовать статическую компиляцию по желанию.

Примечание: вам нужно будет ввести зависимость следующим образом:

LinkGenerator grailsLinkGenerator

И импортировать класс из пакета grails.web.mapping

AFAIK, @GrailsCompileStatic уже позволяет вам использовать методы, такие как save(). В моем случае это проблема только плагина groovy eclipse, в то время как grails run-app работает нормально.

В любом случае, начиная с Grails 3, методы, предоставляемые признаками, доступны путем "реализации" признака непосредственно, как описано здесь

Черты совместимы со статической компиляцией...

class TestController implements Controller {
        @GrailsCompileStatic
        def index() {
            render "test"
        }
    }

Кажется, что g имеет тип NamespacedTagDispatcher, который использует methodMissing для поиска вызываемого метода во время выполнения. Даже если бы вы получили доступ к g во время компиляции, g.createLink() не скомпилирует.

Вы можете извлечь критичный для производительности код в другой метод и аннотировать его с помощью @CompileStatic или написать аннотированный метод, который вызывает g.createLink ()

Другие вопросы по тегам