我正在尝试使用Groovy的SimpleTemplateEngine来生成一些输出而不是StringBuilders,但是我无法获得模板来成功调用我的类中的其他方法(最终调用其他模板来形成嵌套链)。
当模板(下面的例子)调用方法<% 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调用它是因为我无法解决groovy脚本中静态方法的包路径。
有没有人有任何从模板中调用你自己的脚本/类方法的具体例子,或者可以告诉我我做错了什么?
干杯。
答案 0 :(得分:2)
好的,我设法让它工作,最后它相当简单。我必须对所有生成和模板方法使用静态,然后将完全限定的包名称添加到模板内的方法,而不是尝试导入。
还发现我在命令中也缺少打印件。这是固定模板:
public static String itemDescriptorTemplate() {
return = '''\
${itemDescriptor.name} {
repository = "${itemDescriptor.repository}"
props = [
<% print uk.co.e2x.convert.XMLToSlurp.generateItemOutput(itemDescriptor.itemList) %>
]
}
'''
答案 1 :(得分:0)
我使用这样的静态实用程序方法将嵌套模板包含在父模板中:
class TemplateUtils {
static String generateOutput(String templateFilename, Map templateBinding) {
URL templateResource = TemplateUtils.classLoader.getResource(templateFilename)
assert templateResource : "Resource for '${templateFilename}' not found"
new GStringTemplateEngine().createTemplate(templateResource).make(templateBinding)
}
}
然后在父模板中:
Dear $to
<% out.println(com.example.TemplateUtils.generateOutput("letterContent.template", variables)) %>
Regards $from
父模板的绑定变量将中继到variables
变量中的“ letterContent”模板。