使用Configuration.addAutoImport()导入宏时抛出异常

时间:2013-11-26 15:04:41

标签: freemarker

editable.ftl

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

将此内容导入我的模板的正确方法是什么。我试过 cfg.addAutoImport(“我”,“editable.ftl”)。 当我试图处理我的主模板时抛出以下异常。

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

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

失败的指示: ==&GT; $ {field} [在模板“可编辑”第5行第28列]     at freemarker.core.InvalidReferenceException.getInstance(InvalidReferenceException.java:98)[freemarker-2.3.20.jar:2.3.20]     at freemarker.core.EvalUtil.coerceModelToString(EvalUtil.java:382)[freemarker-2.3.20.jar:2.3.20]     at freemarker.core.Expression.evalAndCoerceToString(Expression.java:115)[freemarker-2.3.20.jar:2.3.20]     at 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]     at 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]     at freemarker.core.Environment.include(Environment.java:1712)[freemarker-2.3.20.jar:2.3.20]     at 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]     at freemarker.template.Configuration.doAutoImportsAndIncludes(Configuration.java:1105)[freemarker-2.3.20.jar:2.3.20]     at freemarker.core.Configurable.doAutoImportsAndIncludes(Configurable.java:1271)[freemarker-2.3.20.jar:2.3.20]     at freemarker.core.Configurable.doAutoImportsAndIncludes(Configurable.java:1271)[freemarker-2.3.20.jar:2.3.20]     at freemarker.core.Environment.process(Environment.java:242)[freemarker-2.3.20.jar:2.3.20]

宏代码应该在调用时执行,但似乎在导入期间会调用它们。它在这里处理真的是一个宏吗?请指导我这有什么问题。

1 个答案:

答案 0 :(得分:1)

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

顺便说一句,将[#ftl]设置为tag_syntax会阻止此类意外。这不是向后兼容的默认值......