java - 定义 Freemarker EOL 格式(\n 而不是\r\n)

标签 java spring freemarker

在我的 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/

相关文章:

mysql - 在 Spring Boot 中从 mysql 读取时出现奇怪的超时

java - 使用 Spring Social 在 Facebook 墙上安排帖子

java - Freemarker模板加载

java - onErrorResume 运算符会忽略 flatMap 中抛出的异常

java - 优化 HibernateTemplate 的数据插入

java - 自由标记 : diplay tag on condition without if block

java - 在 Freemarker 模板中编码 base64

Java:JVM 将如何优化对 void 和空函数的调用?

java - 序列化对象时更改字段名称

java - 通过继承将 JSON 反序列化为 Java 对象?