Grails的3标签库

问题描述:

我想申请@GrailsCompileStatic到标签库和歌厅以下错误的静态编译:Grails的3标签库

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: [...]) 
    } 
} 

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

+0

为什么你想静态编译标签库?这看起来像你可能做错了什么......但如果你能解释为什么你需要它,也许这里的某个人可以帮助找到一个适合你的解决方案! – Daniel

+0

@Daniel,我在我的taglib中没有使用groovy动态特性,并希望提高性能。 –

您正在使用一些动态功能,因为通常taglibs会使用它们。即使只是调用“渲染”也是动态的。

如果你真的想要,你可以通过注入一个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: [...]) 

    } 
} 

这工作,但你将有一些工作要做的你,如果你的标签库是做任何远程复杂,因为每次调用渲染,或任何其他标记将不得不为由静态编译的调用取代。这是可能的,但可能不是非常有益。

+0

谢谢,它的工作原理,但现在我有相关的单元测试的问题:) –

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

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

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

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

+1

大概它做的比简化为stackoverflow示例显示更多。无论如何,我当然希望如此! :-) – Daniel