在我的 Spring 应用程序中,我使用 Freemarker 生成导出文件 - 带有标题和循环的简单纯文本 <#list></#list>
渲染项目列表。
@Bean
public freemarker.template.Configuration freemarkerConfiguration() throws IOException, TemplateException {
return new FreeMarkerConfigurationFactoryBean().createConfiguration();
}
// ...
Template template = getFreemarkerTemplate();
Writer fileWriter = getFileWriter(outputFile);
template.process(getExportData(), writer);
// flush and close writer, some additional business logic
我想设置当前 Windows 的行尾格式 \r\n
(CRLF) 到 Unix \n
(低频)
我实际尝试过但不喜欢或不起作用
- 使用 Notepad++ 手动转换 .ftl 文件 EOL - 我不想用很多编辑器处理我的源文件,还有 IntelliJ Git 插件将 EOL 转换为 CRLF - 即使我会修改这一点,也不能保证我的队友会这样做,但这也可能是其他地方的问题
- 添加
<#rt>${'\n'}
在每一行的末尾 - 它只会污染我的代码,开发人员必须记住添加此内容,以防模板更改 - 添加
<#assign str = str?replace(...)
- 似乎不可能,因为此替换仅适用于变量,而不是当前整个文件,而且我没有找到将模板渲染到变量中的方法(我可以创建然后更改 EOL 的包装器,但说实话它看起来也不像一个好的解决方案)
是否有任何全局方法可以设置 EOL 格式,而无需手动单独操作每个 .ftl?
最佳答案
没有这样的配置选项(截至 2.3.29)。 FreeMarker 仅按原样输出模板的静态文本部分。尽管您不喜欢这种方法,但我相信最好的方法是在传递给 FreeMarker 的 Writer
中执行此操作。在大多数应用程序中,这种开销根本不重要。
避免运行时开销的另一个选项是在包装另一个 TemplateLoader
的自定义 TemplateLoader
中执行相同的操作。然而,此类解决方案的问题在于,换行符有时来自模板外部(即来自数据模型),我认为用户也希望这些换行符能够标准化。
因此,即使它是 FreeMarker 的核心功能(我猜可能是),它也可能会即时执行此操作,就像使用自定义 Writer
一样。
关于java - 定义 Freemarker EOL 格式(\n 而不是\r\n),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57408218/