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]
宏代码应该在调用时执行,但似乎在导入期间会调用它们。它在这里处理真的是一个宏吗?请指导我这有什么问题。
答案 0 :(得分:1)
导入时不执行宏(当然,除非您在宏外部的导入FTL中调用它们)。这看起来像标签语法选择的问题。如果FTL没有从默认的[#...]
标记语法切换到<#...>
标记语法,那么唯一的非静态文本部分将是${...}
- s,因此{{1在你的情况下不会定义。所以问题是当你用field
启动模板时它不会切换的原因。也许你在文件的开头有一个看不见的BOM(例如,Windows记事本在编辑UTF-8文件时添加了一个BOM),或[#ftl]
之前的其他东西。
顺便说一句,将[#ftl]
设置为tag_syntax
会阻止此类意外。这不是向后兼容的默认值......