Freemarker变量定义引用另一个变量

时间:2011-09-09 20:42:48

标签: interpolation freemarker

我正在使用Freemarker(FMPP)来自定义文本文件。我想要一个定义插值数据的属性文件,如下所示:

VAR1=some-value
VAR2=${VAR1}

这从我的实际文件中高度简化,但保留了我的用例的本质。该模板包含${VAR2}形式的引用,我希望它会导致some-value被插值。相反,插值是文字${VAR1}

请注意,这与Can a freemarker interpolation contain an interpolation?不同,后者指的是使用变量的值作为变量的名称(间接引用)。此外,can freemarker do second replacement的解决方案涉及修改模板。我希望替换在概念上“在'模板处理之前”发生,因此模板只能引用${VAR2}而不需要知道双重插值。

有没有办法在FreeMarker中实现这一目标?

如果没有,有人可以告诉我Velocity是否会轻易做到这一点?

1 个答案:

答案 0 :(得分:2)

您在.properties文件中引用的变量是否始终来自同一个.properties文件?如果是这样,那么您可以编写一个自定义FMPP DataLoader,它可以在加载文件时执行所需的所有替换。 (或者,tdd数据加载器也可以使用get(varname)和某些eval(...) - s来实现类似的东西,但这可能过于冗长。)

在模板语言级别上解决这个问题时,需要将${...}的输出重新解释为模板片段,然后我也会假设它出来,直到没有任何内容看起来像模板语言构造的输出。我不知道任何模板语言这样做。但是,它可以在FreeMarker中解决,如果需要它的字符串包含一个自定义TemplateScalarModel实现,只要有东西读取字符串的值,就会重复进行评估。 (要在FMPP中使用这样的自定义TemplateModel,您还需要一个自定义FMPP数据加载器,它将以特殊方式包装字符串,然后再将它们返回给FMPP。)