2017-07-08 59 views
0

我想申請@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動態特性,並希望提高性能。 –

回答

0

您正在使用一些動態功能,因爲通常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

謝謝,它的工作原理,但現在我有相關的單元測試的問題:) –

0

我不確定創建一個只顯示模板的新標籤有什麼意義。

Grails已經有一個呈現模板的標記庫。

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

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

+1

大概它做的比簡化爲stackoverflow示例顯示更多。無論如何,我當然希望如此! :-) – Daniel