我试图将@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: [...])
}
}
我做错了什么,如何解决问题?
答案 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]" />