【问题标题】:Exception thrown while importing macros using Configuration.addAutoImport()使用 Configuration.addAutoImport() 导入宏时引发异常
【发布时间】:2013-12-11 19:25:27
【问题描述】:

editable.ftl

[#ftl]
[#macro editable field ]
   [#if field??]
        [#if isEditable]
            <h:inputext value="${field}" />
        [#else]
            ${field?eval}
        [/#if]
    [/#if]
[/#macro]

将其导入我的模板的正确方法是什么。我尝试使用 cfg.addAutoImport("me", "editable.ftl")。 当我尝试处理我的主模板时引发以下异常。

ERROR [freemarker.runtime] (http-localhost-127.0.0.1-8080-1) 执行 FreeMarker 模板时出错:freemarker.core.InvalidReferenceException:以下已评估为 null 或缺失: ==> 字段 [在模板“可编辑”中第 5 行第 30 列]

提示:如果已知失败的表达式合法地为空/缺失,请使用 myOptionalVar!myDefault 指定默认值,或使用 [#if myOptionalVar??]when-present[#else]when-missing[/#如果]。 (这些仅涵盖表达式的最后一步;要涵盖整个表达式,请使用括号:(myOptionVar.foo)!myDefault, (myOptionVar.foo)??

失败的指令: ==> ${field} [在模板“可编辑”第 5 行第 28 列] 在 freemarker.core.InvalidReferenceException.getInstance(InvalidReferenceException.java:98) [freemarker-2.3.20.jar:2.3.20] 在 freemarker.core.EvalUtil.coerceModelToString(EvalUtil.java:382) [freemarker-2.3.20.jar:2.3.20] 在 freemarker.core.Expression.evalAndCoerceToString(Expression.java:115) [freemarker-2.3.20.jar:2.3.20] 在 freemarker.core.DollarVariable.accept(DollarVariable.java:76) [freemarker-2.3.20.jar:2.3.20] 在 freemarker.core.Environment.visit(Environment.java:265) [freemarker-2.3.20.jar:2.3.20] 在 freemarker.core.MixedContent.accept(MixedContent.java:93) [freemarker-2.3.20.jar:2.3.20] 在 freemarker.core.Environment.visit(Environment.java:265) [freemarker-2.3.20.jar:2.3.20] 在 freemarker.core.Environment.include(Environment.java:1712) [freemarker-2.3.20.jar:2.3.20] 在 freemarker.core.Environment.importLib(Environment.java:1784) [freemarker-2.3.20.jar:2.3.20] 在 freemarker.core.Environment.importLib(Environment.java:1733) [freemarker-2.3.20.jar:2.3.20] 在 freemarker.template.Configuration.doAutoImportsAndIncludes(Configuration.java:1105) [freemarker-2.3.20.jar:2.3.20] 在 freemarker.core.Configurable.doAutoImportsAndIncludes(Configurable.java:1271) [freemarker-2.3.20.jar:2.3.20] 在 freemarker.core.Configurable.doAutoImportsAndIncludes(Configurable.java:1271) [freemarker-2.3.20.jar:2.3.20] 在 freemarker.core.Environment.process(Environment.java:242) [freemarker-2.3.20.jar:2.3.20]

宏代码应该在调用时执行,但这里似乎它们是在导入期间调用的。这里处理的真的是宏吗?请指导我这是怎么回事。

【问题讨论】:

    标签: freemarker


    【解决方案1】:

    宏在导入时不会被执行(当然,除非您在宏之外的导入的 FTL 中调用它们)。这看起来像是标签语法选择的问题。如果 FTL 没有从默认的 &lt;#...&gt; 标签语法切换到 [#...] 标签语法,那么唯一的非静态文本部分将是 ${...}-s,因此 field 不会在你的情况。所以问题是为什么当你用[#ftl] 启动模板时它不会切换。也许您在文件的开头有一个不可见的 BOM(例如,Windows 记事本在编辑 UTF-8 文件时添加了一个 BOM),或者在 [#ftl] 之前有其他东西。

    顺便说一句,将tag_syntax 设置为auto_detect 可以防止出现此类意外。这不是向后兼容的默认设置...

    【讨论】:

    • 谢谢,不可见字符似乎有问题。我重新创建了文件,现在它已经消失了。
    猜你喜欢
    • 1970-01-01
    • 2019-02-10
    • 2020-02-09
    • 1970-01-01
    • 2014-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多