Freemarker:如何禁用变量内的空格剥离,保留尾随空格
解决方案
核心问题分析
你遇到的问题是FreeMarker在单独输出包含尾随空格的字符串变量时,空格被意外截断,但拼接场景下正常保留。这是因为FreeMarker对单独变量输出和字符串拼接输出的处理逻辑略有差异,单独输出时可能触发了隐性的空白优化(尽管默认配置未开启全局trim)。
可行解决方法
方法1:强制使用字符串拼接输出
利用你已验证的「拼接时空格保留」特性,即使单独输出分隔符,也通过空字符串拼接触发拼接逻辑:
<#assign separator = ", " /> <!-- 单独输出分隔符(保留空格) --> ${"" + separator} <!-- 计算长度(正常返回2) --> 分隔符长度:${separator?length}
方法2:使用<#print>指令输出
FreeMarker的<#print>指令会严格输出字符串的所有字符,包括尾随空格,避免变量单独输出时的隐性处理:
<#assign separator = ", " /> <!-- 单独输出分隔符 --> <#print separator /> <!-- 长度计算不受影响 --> ${separator?length}
方法3:显式确认全局配置(排除配置问题)
确保Java端FreeMarker配置未开启空白修剪,尽管默认是关闭的,但可显式声明排除干扰:
Configuration cfg = new Configuration(Configuration.VERSION_2_3_30); cfg.setTrimWhitespace(false); // 显式关闭全局空白修剪
关键提示
- 不要使用宏定义分隔符,宏是模板片段而非字符串类型,无法直接进行长度计算等字符串操作。
- 始终确保Java传递给模板的分隔符变量是完整的
", "(未被trim过),可通过System.out.println("'" + separator + "'")在Java端验证。
内容的提问来源于stack exchange,提问作者Fransis1981
相关产品推荐
相关产品推荐

