Grails 3静态编译taglib

时间:2017-07-08 20:08:04

标签: java grails taglib static-compilation

我试图将@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 个答案:

答案 0 :(得分:1)

您正在使用一些动态功能,因为taglib通常会使用它们。甚至只是调用“渲染”在某种意义上是动态的。

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

答案 1 :(得分:0)

我不确定创建一个只呈现模板的新标记有什么意义。

Grails已经有一个用于呈现模板的标记库。

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

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

相关问题