Grails 3 статическая компиляция taglib
Я пытаюсь применить @GrailsCompileStatic к taglib и получаю следующую ошибку:
Ошибка:(19, 16) Groovyc: [Проверка статического типа] - Не удается найти соответствующий метод com.tempvs.image.MyTagLib#render(java.util.LinkedHashMap). Пожалуйста, проверьте правильность заявленного типа и существует ли метод.
Пример кода:
@GrailsCompileStatic
class MyTagLib {
...
String myTag = { Map attrs ->
...
out << render(template: '/templates/myTemplate', model: [...])
}
}
Что я делаю не так и как мне решить проблему?
2 ответа
Вы используете некоторые динамические функции, потому что теги обычно используют их. Даже просто вызывать "рендер" в некотором смысле динамично.
Если вы действительно этого хотите, вы можете обойти это, вставив PageRenderer и используя его для визуализации вашей страницы, а затем выведя полученный HTML-код. Я не уверен, что это того стоит, но я точно не знаю ваших требований к производительности!
Пример:
import grails.compiler.GrailsCompileStatic
import grails.gsp.PageRenderer
@GrailsCompileStatic
class StaticTestTagLib {
static namespace = "staticTest"
PageRenderer groovyPageRenderer
String myTag = { Map attrs ->
out << groovyPageRenderer.render(template: '/templates/myTemplate', model: [...])
}
}
Это работает, но у вас будет некоторая работа впереди, если ваш taglib делает что-то сложное удаленно, потому что КАЖДЫЙ вызов для рендеринга или любой другой тег будет заменен статически скомпилированным вызовом. Это возможно, но, возможно, не очень выгодно.
Я не уверен, какой смысл создавать новый тег, который просто отображает шаблон.
У Grails уже есть библиотека тегов, которая отображает шаблон.
<g:render template="displaybook" model="['book':book,'author':author]" />