taglib的Grails 3静态编译

Grails 3 static compilation of taglib

我正在尝试将 @GrailsCompileStatic 应用于 taglib 并收到以下错误:

Error:(19, 16) Groovyc: [Static type checking] - Cannot find matching method com.tempvs.image.MyTagLib#render(java.util.LinkedHashMap ). Please check if the declared type is right and if the method exists.

代码示例:

@GrailsCompileStatic
class MyTagLib {
    ...
    String myTag = { Map attrs ->
        ...
        out << render(template: '/templates/myTemplate', model: [...])
    }
}

我做错了什么,我该如何解决这个问题?

您正在使用一些动态功能,因为一般的标签库确实会使用它们。即使只是调用 "render" 在某种意义上也是动态的。

如果您真的想要,您可以通过注入 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 正在做任何远程复杂的事情,您将有一些工作要做,因为每次调用 render 或任何其他标记都必须由静态编译调用替换。这是可能的,但可能不会有太大好处。

我不确定创建仅呈现模板的新标签有什么意义。

Grails 已经有一个呈现模板的标签库。

   <g:render template="displaybook" model="['book':book,'author':author]" />

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