2012-05-30 61 views
1

我想使用Groovy的SimpleTemplateEngine生成一些輸出而不是StringBuilders,但是我無法獲取模板來成功調用其他類中的方法(最終調用其他模板組成一個嵌套鏈)。Groovy嵌套模板 - 無法從模板中調用類中的方法

當模板(下面的例子)調用方法<% generateItemOutput(itemDescriptor.itemList) %>我得到一個異常:

groovy.lang.MissingMethodException: No signature of method: 
SimpleTemplateScript1.generateItemOutput() is applicable for 
argument types: (java.util.ArrayList) 

我試圖讓所有的方法靜態的,在模板中添加進口靜態方法(如suggested here),但我得到unable to resolve class ...的進口我用:

SimpleTemplateScript1.groovy: 1: unable to resolve class uk.co.e2x.convert.XMLToSlurp.generateItemOutput 
@ line 1, column 20. 
    out.print(""""""); import uk.co.e2x.convert.XMLToSlurp.generateItemOutput ; 
        ^

下面是我在做什麼,我沒有static個樣本:

public String generateItemDescriptorOutput(itemDescriptor) { 
    def params = [itemDescriptor: itemDescriptor] 
    def template = new groovy.text.SimpleTemplateEngine().createTemplate(itemDescriptorTemplate()) 
    def writeable = template.make(params) 
    return writeable.toString() 
} 

public String generateItemOutput(itemList) { 
    ... 
} 

public String itemDescriptorTemplate() { 
    return = '''\ 
${itemDescriptor.name} { 
repository = "${itemDescriptor.repository}" 
props = [ 
    <% generateItemOutput(itemDescriptor.itemList) %> 
] 
} 
''' 
} 

我用java -cp ...調用它,但通過groovy調用相同的問題。我轉移到通過java調用它的原因是我無法在常規腳本中找到靜態方法的包路徑。

有沒有人有任何具體的例子從模板內調用自己的腳本/類方法,或者可以告訴我我做錯了什麼?

乾杯。

回答

1

好吧,我設法讓它工作,最後它非常簡單。我必須對所有生成和模板方法使用靜態,然後將完全限定的包名稱添加到模板內的方法,而不是嘗試執行導入。

也發現我在命令中也缺少打印件。以下是固定模板:

public static String itemDescriptorTemplate() { 
    return = '''\ 
${itemDescriptor.name} { 
repository = "${itemDescriptor.repository}" 
props = [ 
    <% print uk.co.e2x.convert.XMLToSlurp.generateItemOutput(itemDescriptor.itemList) %> 
] 
} 
'''