【问题标题】:Grails 3 static compilation of taglibGrails 3 taglib 的静态编译
【发布时间】:2017-12-12 21:43:14
【问题描述】:

我正在尝试将@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: [...])
    }
}

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

【问题讨论】:

  • 你为什么要静态编译你的taglib?这似乎是您可能做错了什么......但如果您能解释为什么需要它,也许这里有人可以帮助找到适合您的解决方案!
  • @Daniel,我在我的 taglib 中没有使用常规的动态功能,并且希望提高性能。

标签: java grails taglib static-compilation


【解决方案1】:

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

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

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

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

【讨论】:

  • 大概它比简化的stackoverflow示例显示的要多。无论如何,我当然希望如此! :-)
【解决方案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 正在做任何远程复杂的事情,你将有一些工作要做,因为每个渲染调用或任何其他标签都必须被静态编译的调用替换。这是可能的,但可能不会有很大的好处。

【讨论】:

  • 谢谢,它可以工作,但现在我在相关的单元测试中遇到了问题 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-27
  • 1970-01-01
  • 1970-01-01
  • 2022-10-05
  • 2010-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多