
本文详解 FreeMarker 中字符串拼接的正确语法,重点解决模板内动态构建资源键(如 "resource.bundle.key" + dataModel.value)并传递给 宏的常见问题,避免因语法错误导致解析失败。
本文详解 freemarker 中字符串拼接的正确语法,重点解决模板内动态构建资源键(如 `"resource.bundle.key" + datamodel.value`)并传递给 `` 宏的常见问题,避免因语法错误导致解析失败。
在 FreeMarker 模板中拼接字符串是一个高频需求,尤其在结合 Spring MVC 使用 读取国际化资源时——常需将固定前缀与数据模型中的动态值组合成完整的资源键(例如 "label.user." + userRole)。但需特别注意:FreeMarker 的表达式语法与 Java 或 JavaScript 不同,不支持在宏调用参数中混用 ${...} 插值符号与操作符(如 +)嵌套。
✅ 正确写法如下(推荐):
该写法直接在宏参数位置使用 + 运算符拼接字符串字面量与变量,FreeMarker 会自动将 dataModel.value 转为字符串并完成连接,无需额外 ${} 包裹——因为此处已处于表达式上下文(即宏参数内部),dataModel.value 本身就是合法的 FTL 表达式。
✅ 更清晰、更健壮的写法(显式分组,推荐用于复杂场景):
括号明确界定拼接操作的边界,避免歧义(例如当右侧变量为复合表达式时,如 user?.role!""),也提升可读性与维护性。
❌ 常见错误示例及原因:
<!-- 错误1:在已为表达式上下文中重复使用 ${} -->
<!-- ❌ 报错:FTL stack trace: Expected a string or number here, found ... -->
<!-- 错误2:嵌套 ${} 导致语法解析失败 -->
<!-- ❌ 语法非法:${} 内部不能再出现 ${},且宏参数本身不是插值区域 -->
⚠️ 注意事项:
- 确保 dataModel.value 非 null;若可能为空,建议使用默认值操作符 !,例如:"resource.bundle.key" + (dataModel.value!"default")
- 拼接后的完整键(如 "resource.bundle.keyADMIN")必须真实存在于你的 .properties 资源文件中,否则 messageText 将回退至默认值 "undefined"
- 若 dataModel.value 含特殊字符(如点号 .、空格),需确认资源键命名规范是否允许;必要时做标准化处理(如 ?replace(" ", "_"))
总结:FreeMarker 字符串拼接简洁而严格——用 + 即可,杜绝冗余 ${},善用括号提升鲁棒性。掌握这一基础,即可安全、高效地构建动态国际化键,大幅提升模板灵活性与可维护性。










