将Groovy TemplateEngine绑定到任何变量名

时间:2015-10-20 17:02:42

标签: groovy

我正在尝试编写一个方法:

  1. 从本地文件系统
  2. 加载模板文件(*.tpl
  3. 使用提供的变量列表
  4. 参数化该模板文件

    迄今为止的最佳尝试:

    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字符串的值为:

    println parameterizedTemplate
    // Prints:
    Hello John,
    
    You are awesome! Mark even says so!
    
    Sincerely,
    @smeeb
    

    这里的诀窍是该方法需要能够对任何提供的模板文件使用任何提供的变量列表!

    这可以通过反思来实现吗?这意味着TemplateEngine看起来只是提供的String变量列表,并将它们替换为同名变量(在模板中找到)?

1 个答案:

答案 0 :(得分:4)

您可以像这样传递地图:

SELECT DISTINCT user_id FROM cloud_storage;