【问题标题】:Using Freemarker to generate Java .properties files使用 Freemarker 生成 Java .properties 文件
【发布时间】:2016-01-08 12:42:25
【问题描述】:

我目前正在使用 Freemarker 生成一些配置文件。到目前为止,这些文件要么是 xml 文件,要么是专有格式的文本文件。我现在想生成一些 Java .properties 文件,但遇到了几个问题。

首先是字符编码。据我所见,只需添加

<#ftl encoding="8859_1">

到文件的开头应该解决这个问题。

第二个问题是键和值的转义。这些键可能没问题,因为无论如何我都会在模板中对它们进行硬编码,这样我就可以在模板中对它们进行转义。这些值将来自我的数据模型,因此需要转义。

我可以看到如何创建自己的 user defined directive 并通过将其安装为 shared variable 在我的模板中使用它。

这是最好的还是唯一的方法?我会认为生成 .properties 文件之前已经处理过很多次,并且希望在我开始编写自己的代码之前可能已经存在一些东西。

【问题讨论】:

  • 关于那个字符集名称,Java 可能识别 8859_1(我不知道),但应该是 ISO-8859-1

标签: java freemarker properties-file


【解决方案1】:

类 java.util.Properties 有各种存储方法来将属性保存到 OutputStreams 或文件。这似乎比尝试适应 freemarker 更可取。

【讨论】:

    【解决方案2】:

    我不明白生成properties 文件所特有的字符集问题。但请注意,模板的字符集和输出的字符集是独立的,因此您不妨对这些模板使用与其他模板相同的字符集(比如可能是 UTF-8)。

    在转义时,如果可以,请始终使用自动转义。在 2.3.24 中这将特别流畅,但除非您被允许使用未发布的版本,否则您必须等到 2 月底左右。 (如果您可以使用未发布/非官方版本,you can find 在开发者列表存档中了解内部测试版本。)在 2.3.24 之前,有&lt;#escape x as propEsc(x)&gt;all the template content here&lt;/#escape&gt;,其中propEscTemplateMethodModelEx(不是@987654326 @) 您已添加为共享变量等。所以所有${...}-s 都会被神奇地逃脱。

    【讨论】:

    • 字符集并没有什么特别的问题——只是 Java .properties 文件总是使用 8859_1。在我的情况下,我有许多使用通用数据模型同时模板化的文件,除了 .properties 文件之外,所有文件都是 UTF-8。我正在进行批量操作,遍历所有模板并依次处理每个模板 - 我不想有任何特殊情况。似乎在模板中添加编码指令解决了这个问题。
    • 添加#ftl encoding 仅在您确保结果OutputStreamWriter 使用ISO-8859-1 时解决此问题。一种想法是使用template.getEncoding() 的返回值来设置输出字符集。 (顺便说一句,它又是 2.3.24,但您可以在那里配置 FreeMarker,以便所有 *.properties.ftl 模板使用 ISO-8859-1,而其他模板使用 UTF-8。因此,如果 @987654332 @ headers。类似地,您将能够指定基于模板名称模式使用的转义算法。)
    • 我已将输出编码设置为与 .properties 模板的输入编码相匹配,该模板(现在)设置为 ISO_8859_1,一切似乎都运行良好。期待2.3.24!我怀疑 .properties 文件总是会很尴尬,因为它们似乎没有使用“文件范围”的转义算法——它们的键和值的转义算法略有不同。
    • 虽然键通常不包含任意字符。但是,是的,通常模板无法知道这一点。您可以做的一件事是默认转义属性值,然后向键添加显式转义。像${escKey(key)} = ${value} 这样的东西。使用 2.3.24 转义机制,escKey 函数可以在其返回值中表明它已被转义,因此您不会以双重转义结束。
    • 请注意,您的评论中的字符集名称仍然不规范,因为您使用的是 _ 而不是 -
    猜你喜欢
    • 2017-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-02
    • 1970-01-01
    • 2021-11-28
    • 2014-02-06
    • 2012-01-15
    相关资源
    最近更新 更多