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]" />

https://docs.grails.org/latest/ref/Tags/render.html

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