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 ()