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]" />
我正在尝试将 @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]" />