2012-05-30 100 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) %> 
] 
} 
'''