使用任何变量名绑定Groovy TemplateEngine
我正在尝试编写一种方法:使用任何变量名绑定Groovy TemplateEngine,groovy,Groovy,我正在尝试编写一种方法: 从本地文件系统加载模板文件(*.tpl) 使用提供的变量列表参数化该模板文件 迄今为止的最佳尝试: String loadParameterizedTemplateByName(String templateName, String... variables) { InputStream inputStream = this.class.classLoader.getResourceAsStream(templateName)
*.tpl
)String loadParameterizedTemplateByName(String templateName,
String... variables) {
InputStream inputStream =
this.class.classLoader.getResourceAsStream(templateName)
StringWriter writer = new StringWriter()
IOUtils.copy(inputStream, writer, 'UTF-8')
String templateBody = writer.toString()
def binding = variablesAsBinding(variables) // ?!?!
engine.createTemplate(templateBody).make(binding).toString()
}
例如,假设我有以下HelloEmail.tpl
模板文件:
HelloEmail.tpl
==============
Hello ${firstName},
You are awesome! ${someGuy} even says so!
Sincerely,
${me}
那么我想要的调用是:
String firstName = 'John'
String someGuy = 'Mark'
String me = '@smeeb'
String parameterizedTemplate =
loadParameterizedTemplateByName('HelloEmail.tpl', firstName, someGuy, me)
因此最终结果是parameterizedTemplate
string的值为:
println parameterizedTemplate
// Prints:
Hello John,
You are awesome! Mark even says so!
Sincerely,
@smeeb
这里的技巧是,该方法需要能够针对任何提供的模板文件使用任何提供的变量列表强>
这可以通过反射来实现吗?这意味着
TemplateEngine
只是看起来像提供的字符串变量列表,并用它们替换相同名称的变量(如在模板中找到的)?您可以这样传递一个映射:
import groovy.text.markup.MarkupTemplateEngine
import groovy.text.markup.TemplateConfiguration
String loadParameterizedTemplateByName(Map variables, String templateName) {
def engine = new groovy.text.SimpleTemplateEngine()
this.class.getResource(templateName).withReader { reader ->
engine.createTemplate(reader).make(variables)
}
}
def result = loadParameterizedTemplateByName('/mail.tpl', firstName:'Tim', someGuy:'StackOverflow', me:'smeeb')
assert result == 'Hello Tim,\n\nYou are awesome! StackOverflow even says so!\n\nSincerely,\nsmeeb'