使用任何变量名绑定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'